package cn.fl.project.service.impl;

import cmm.comm.facade.framework.api.ISysDictionaryApiService;
import cmm.comm.facade.framework.dto.SysDictionaryDTO;
import cmm.mid.core.framework.dto.DataResultDTO;
import cmm.mid.core.framework.page.DataResultVO;
import cmm.mid.core.framework.page.KeyValueVO;
import cmm.mid.core.framework.page.Pager;
import cn.cmm.base.framework.constant.BaseConstant;
import cn.cmm.base.framework.constant.BaseExceptionConstant;
import cn.cmm.base.framework.exception.BaseException;
import cn.cmm.base.framework.utils.CollectionUtils;
import cn.cmm.base.framework.utils.DecimalUtils;
import cn.cmm.base.framework.utils.StringUtils;
import cn.fl.framework.base.context.CurrentThreadContext;
import cn.fl.framework.constant.DictionaryConstant;
import cn.fl.institution.api.IInsQuatPrpsAndPrdSchMApiService;
import cn.fl.preloan.enums.LogBusinessTypeEnum;
import cn.fl.project.ProjectUtils;
import cn.fl.project.api.*;
import cn.fl.project.condition.PrjPrdBscInfoQueryCondition;
import cn.fl.project.condition.PrjQuatPrpsQueryCondition;
import cn.fl.project.constant.PrjBscInfoConstant;
import cn.fl.project.constant.PrjQuatPrpsCfgMConstant;
import cn.fl.project.constant.PrjQuatPrpsConstant;
import cn.fl.project.constant.PrjQuatPrpsFeeConstant;
import cn.fl.project.dto.PrjBscInfoDTO;
import cn.fl.project.dto.PrjPrdBscInfoDTO;
import cn.fl.project.dto.PrjPrdExtDTO;
import cn.fl.project.dto.PrjQuatPrpsDTO;
import cn.fl.project.service.*;
import cn.fl.project.transform.PrjQuatPrpsVOTransform;
import cn.fl.project.vo.*;
import com.alibaba.fastjson.JSON;
import com.lionbridge.log.ext.ExtSlf4jLogger;
import com.lionbridge.log.ext.ExtSlf4jLoggerBuilder;
import com.lionbridge.log.ext.LogTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.*;
/**
 * @Description: 项目报价方案表 客户端服务层接口实现
 * @Description: 业务层方法名称前缀：新增：add* 删除：remove* 修改：modify* 查询对象：select* get* 批量：batch* 查询集合：search*
 */
@Slf4j
@Service
public class PrjQuatPrpsServiceImpl implements IPrjQuatPrpsService {
	private static ExtSlf4jLogger logger = ExtSlf4jLoggerBuilder.create()
			.setLogger(log).setBusinessType(LogBusinessTypeEnum.QUOTATION_SCHEME.getCode())
			.setSubBusinessType(LogBusinessTypeEnum.QUOTATION_SCHEME.getCode())
			.setLogType(LogTypeEnum.BUSINESS).build().setKeywords("PrjQuatPrpsPayReb");
	/**
	 * TODO 自定义 API 暴露服务
	 */
	@Autowired
	private IProjectApiService projectApiService;
    @Autowired
    private IPrjBscInfoService prjBscInfoService;

	@Autowired
	private ISysDictionaryApiService sysDictionaryApiService;

	@Autowired
	private IProjectModifyApiService projectModifyApiService;
	@Autowired
	private IPrjQuatPrpsApiService prjQuatPrpsApiService;

    @Autowired
    private IPrjQuatPrpsZGApiService prjQuatPrpsZGApiService;
    /**
     * 新能源相关的测算
     */
    @Autowired
    private IPrjQuatPrpsXNYApiService prjQuatPrpsXNYApiService;
	/**
	 * 资管报价测算
	 */
    @Autowired
	private IInsQuatPrpsAndPrdSchMApiService insQuatPrpsAndPrdSchMApiService;

	/**
	 * 方案配置服务
	 */
	@Autowired
	private IPrjQuatPrpsCfgMService prjQuatPrpsCfgMService;

	@Autowired
	IPrjPrdExtApiService prjPrdExtApiService ;
	@Autowired
	IPrjPrdBscInfoService prjPrdBscInfoService ;

	@Override
	public PrjQuatPrpsVO selectById(Long id) throws BaseException{
		if(StringUtils.isEmpty(id)){
			logger.info("获取报价方案配置,参数id为空");
			return null;
		}
		//TODO 业务逻辑
		PrjQuatPrpsVO vo  = PrjQuatPrpsVOTransform.toVO(this.projectApiService.selectPrjQuatPrpsById(id,CurrentThreadContext.getCurrentSysCd(),CurrentThreadContext.getCurrentOrgCd()));
		//计算首付款、合计本金、合计利息、合计剩余本金、合计租金
		vo = getTotalValue(vo);
		sortPrjPayList(vo.getPrjQuatPrpsPaySchList());
		return vo;
	}


	private PrjQuatPrpsVO getTotalValue(PrjQuatPrpsVO vo) {
		List<PrjQuatPrpsPaySchVO> payList = vo.getPrjQuatPrpsPaySchList();
		List<PrjQuatPrpsFeeVO> detailList = vo.getPrjQuatPrpsFeelist();
		//合计本金、合计利息、合计剩余本金、合计租金
		 double  totalRntAmt = 0d;//合计租金
		 double  totalPrinAmt = 0d;//合计本金
		 double  totalIntAmt = 0d;//合计利息
		 double totalRemPrinAmt = 0d;//合计剩余本金
		 double firstPayAmt = 0d;//首付款
		 vo.setTotLsItmAmt(DecimalUtils.convertYuanToFen(vo.getTotLsItmAmt()).doubleValue());
		 vo.setContAmt(DecimalUtils.convertYuanToFen(vo.getContAmt()).doubleValue());
		if(null!=vo){
			if(vo.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_BEGI_NO_EQUAL)||vo.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_END_NO_EQUAL)){
				vo.setIsModify(BaseConstant.IS_YESNO_YES);
			}
			if(CollectionUtils.isNotEmpty(payList)){
				for (PrjQuatPrpsPaySchVO prjQuatPrpsPaySchVO : payList) {
					totalRntAmt = DecimalUtils.add(totalRntAmt, prjQuatPrpsPaySchVO.getRntAmt());
					totalPrinAmt = DecimalUtils.add(totalPrinAmt, prjQuatPrpsPaySchVO.getPrinAmt());
					totalIntAmt = DecimalUtils.add(totalIntAmt, prjQuatPrpsPaySchVO.getIntAmt());
					//将分转换为元
					prjQuatPrpsPaySchVO.setPrinAmt(DecimalUtils.convertFenToYuan(prjQuatPrpsPaySchVO.getPrinAmt().longValue()));
					prjQuatPrpsPaySchVO.setIntAmt(DecimalUtils.convertFenToYuan(prjQuatPrpsPaySchVO.getIntAmt().longValue()));
					prjQuatPrpsPaySchVO.setRemPrinAmt(DecimalUtils.convertFenToYuan(prjQuatPrpsPaySchVO.getRemPrinAmt().longValue()));
					prjQuatPrpsPaySchVO.setRntAmt(DecimalUtils.convertFenToYuan(prjQuatPrpsPaySchVO.getRntAmt().longValue()));
				}
			}
			//计算首付款

			if(CollectionUtils.isNotEmpty(detailList)){
				//首期租金
				double firstRntAmt = 0d;
				for (PrjQuatPrpsFeeVO firstDetail : detailList) {
					if(firstDetail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_DOWNPAY)){
						firstRntAmt = ProjectUtils.getFirstAmt(vo.getTotLsItmAmt(),vo.getContAmt(),firstDetail.getCalBaseCd(),firstDetail.getFeePct());
					}
				}

				for (PrjQuatPrpsFeeVO detail : detailList) {
		/*			//留购价要乘以产品数量
					if(detail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_PURCH_PRICE)
							&&detail.getCntWayCd().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CNT_WAY_DOWNPAY)){
						PrjPrdBscInfoQueryCondition prdQc = new PrjPrdBscInfoQueryCondition();
						double purchPrice =0d;
						if(StringUtils.isNotEmpty(vo.getPrjId())){
							prdQc.setPrjId(vo.getPrjId());
							List<PrjPrdBscInfoVO> prdList=	this.prjPrdBscInfoService.searchList(prdQc);
							if(CollectionUtils.isNotEmpty(prdList)){
								for (PrjPrdBscInfoVO prjPrdBscInfoVO : prdList) {
									purchPrice = DecimalUtils.add(purchPrice, DecimalUtils.mul(detail.getFeeAmt(), prjPrdBscInfoVO.getPrdQty(), 2)) ;
								}
							}
						}
						firstPayAmt=DecimalUtils.add(purchPrice, firstPayAmt);
					}*/
					//除去留购价的其他费用
				//	if(!detail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_PURCH_PRICE)){
						if(detail.getCntWayCd().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CNT_WAY_DOWNPAY)){
							//计入首期款的费用项
				/*			if(detail.getIsFixedAmt().equals(BaseConstant.IS_YESNO_NO)){
								//按比计算
								//首期租金
								double amt  = 0d;
								if(detail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_DOWNPAY)){
									amt = ProjectUtils.getFirstAmt(vo.getTotLsItmAmt(),vo.getContAmt(),detail.getCalBaseCd(),detail.getFeePct());
								}else{
									//其他不是首期租金按比例计算的值
									amt =  ProjectUtils.getAmtByCalBase(vo.getTotLsItmAmt(),vo.getContAmt(),firstRntAmt,detail.getCalBaseCd(),detail.getFeePct());
								}
								firstPayAmt=DecimalUtils.add(amt, firstPayAmt);
							}else{
								//固定值
								firstPayAmt=DecimalUtils.add(detail.getFeeAmt(), firstPayAmt);
							}*/
							firstPayAmt=DecimalUtils.add(detail.getFeeAmt(), firstPayAmt);
						}
				//	}
					//转换分为元
					detail.setFeeAmt(DecimalUtils.convertFenToYuan(detail.getFeeAmt().longValue()));
				}
			}
			vo.setPrjQuatPrpsFeelist(detailList);
			vo.setPrjQuatPrpsPaySchList(payList);
			vo.setActLsAmt(DecimalUtils.convertFenToYuan(Double.valueOf((vo.getActLsAmt())).longValue()));
			vo.setEachEstRntAmt(DecimalUtils.convertFenToYuan(Double.valueOf((vo.getEachEstRntAmt())).longValue()));
			vo.setTotalRntAmt(DecimalUtils.convertFenToYuan(Double.valueOf((totalRntAmt)).longValue()));
			vo.setTotalRemPrinAmt((DecimalUtils.convertFenToYuan(Double.valueOf((totalRemPrinAmt)).longValue())));
			vo.setTotalPrinAmt((DecimalUtils.convertFenToYuan(Double.valueOf((totalPrinAmt)).longValue())));
			vo.setTotalIntAmt((DecimalUtils.convertFenToYuan(Double.valueOf((totalIntAmt)).longValue())));
			vo.setFirstPayAmt(DecimalUtils.convertFenToYuan(Double.valueOf(firstPayAmt).longValue()));
			vo.setContAmt(DecimalUtils.convertFenToYuan(Double.valueOf(vo.getContAmt()).longValue()));
			vo.setTotLsItmAmt(DecimalUtils.convertFenToYuan(Double.valueOf(vo.getTotLsItmAmt()).longValue()));
			if(null!=vo.getTenThouCoef()){
			    vo.setTenThouCoef(DecimalUtils.convertFenToYuan(Double.valueOf(vo.getTenThouCoef()).longValue()));
            }
		}
		return vo;
	}


	@Override
	public boolean removeById(Long id) throws BaseException{
		if(StringUtils.isEmpty(id)){
			return false;
		}
		//return this.prjQuatPrpsApiService.removeById(id);
		//TODO 业务逻辑
		return false;
	}

	/**
     * 删除
     * @param ids
     * @return
     */
    public boolean removeByIds(List<Long> ids)throws BaseException{
    	if(CollectionUtils.isEmpty(ids)){
			logger.info("获取报价方案配置,删除数据,参数id为空");
			return false;
		};
		return projectApiService.removePrjQuatPrpsByIds(ids);
    }


	@Override
	public Pager searchListPage(Pager page) throws BaseException{
		if(null == page)page = new Pager();
		Pager  pager = this.projectApiService.searchPrjQuatPrpsListPage(page,CurrentThreadContext.getCurrentSysCd(),CurrentThreadContext.getCurrentOrgCd());
		List<PrjQuatPrpsVO> list = PrjQuatPrpsVOTransform.toVOList((List<PrjQuatPrpsDTO>)pager.getResultList());
		if(CollectionUtils.isNotEmpty(list)){
			for (PrjQuatPrpsVO prjQuatPrpsVO : list) {
				PrjQuatPrpsQueryCondition qc = new PrjQuatPrpsQueryCondition();
				qc.setIsFormalPrps(BaseConstant.IS_YESNO_YES);
				qc.setPrjId(prjQuatPrpsVO.getPrjId());
				qc.setPrpsTypCd(PrjQuatPrpsConstant.CODE_PRJ_QUAT_TYP_QUOTE);
				List<PrjQuatPrpsVO>  prjQuatList = this.searchList(qc);
				if(CollectionUtils.isNotEmpty(prjQuatList)){
					prjQuatPrpsVO.setQuatId(prjQuatList.get(0).getId());
				}
				if (prjQuatPrpsVO.getSmallLoanAmt() != null){
					prjQuatPrpsVO.setSmallLoanAmt(DecimalUtils.convertFenToYuan(prjQuatPrpsVO.getSmallLoanAmt().longValue()));
				}
			}
		}
		pager.setResultList(list);
		return pager;
	}

	@Override
	public Long add(PrjQuatPrpsVO prjQuatPrps) throws BaseException {
		if(null == prjQuatPrps){
			logger.info("项目报价方案,添加数据,参数为空");
			return null;
		}
		//页面直接点击的保存没测算，先测算再保存
		if(prjQuatPrps.getPrjQuatPrpsPaySchList().size()==0){
			prjQuatPrps = this.prjQuatPrpsCalculate(prjQuatPrps);
			convertPrjQuatPrpsYuanToFen(prjQuatPrps);
		}
		return this.projectApiService.addPrjQuatPrpsAndDetail(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps));
	}

	@Override
	public boolean modify(PrjQuatPrpsVO prjQuatPrps) throws BaseException {
		if(null == prjQuatPrps){
			logger.info("项目报价方案,修改数据,参数为空");
			return false;
		}
		prjQuatPrps = this.prjQuatPrpsCalculate(prjQuatPrps);
		convertPrjQuatPrpsYuanToFen(prjQuatPrps);
		return this.projectApiService.modifyPrjQuatPrpsAndDetail(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps));
	}

	@Override
	public boolean modifyPrjQuatPrps(PrjQuatPrpsVO entity) throws BaseException {
		return prjQuatPrpsApiService.modifyPrjQuatPrpsById(PrjQuatPrpsVOTransform.toDTO(entity));
	}

    @Override
    public boolean modifyQuatPrpsByPrjId(PrjQuatPrpsVO entity) {
        return prjQuatPrpsApiService.modifyQuatPrpsByPrjId(PrjQuatPrpsVOTransform.toDTO(entity));
    }

    /**
	 * 疫情项目
	 * @param prjQuatPrps
	 * @return
	 * @throws BaseException
	 */
	@Override
	public PrjQuatPrpsVO prjQuatPrpsCalculateYq(PrjQuatPrpsVO prjQuatPrps) throws BaseException {
		prjQuatPrps = PrjQuatPrpsVOTransform.toVO(this.prjQuatPrpsApiService.prjQuatPrpsCalculateYq(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
		prjQuatPrps = this.convertPrjQuatPrpsFenToYuan(prjQuatPrps);
		return prjQuatPrps;
	}

	@Override
	public PrjQuatPrpsVO prjQuatPrpsCalculate(PrjQuatPrpsVO prjQuatPrps) throws BaseException {
		String payWayCd = prjQuatPrps.getPayWayCd();
		PrjQuatPrpsCfgMVO prjQuatPrpsCfgM = this.prjQuatPrpsCfgMService.selectById(prjQuatPrps.getPrpsCfgId());
		//乘用车方案单独写
		PrjBscInfoDTO prjBsc = this.projectApiService.selectById(prjQuatPrps.getPrjId());
		String cstMgrOrgCd = prjBsc.getCstMgrOrgCd();
		if (prjBsc.getBuOrgCd().equals(PrjBscInfoConstant.CODE_BU_ORG_CD_QCJR)) {
			if (prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_MULTI__STEP_INTER_GH)) {
				prjQuatPrps = prjQuatPrpsCalculateForQCJRGH(prjQuatPrps);
			} else {
				prjQuatPrps = prjQuatPrpsCalculateForQCJR(prjQuatPrps);
			}
		} else if (prjBsc.getBuOrgCd().equals(PrjBscInfoConstant.CODE_BU_ORG_CD_ZC) && StringUtils.isBlank(prjQuatPrpsCfgM.getPrpsPrdTypCd())) {
			prjQuatPrps = prjQuatPrpsCalculateForZC(prjQuatPrps);
		} else if (prjBsc.getBuOrgCd().equals(PrjBscInfoConstant.CODE_BU_ORG_CD_XNY)) {
//			if(!prjBsc.getPrjTypCd().equals(PrjBscInfoConstant.PRJ_TYP_CD_XSHZ)){
			if (prjBsc.getBizTypCd().equals(PrjBscInfoConstant.PRJ_BIZ_TYP_CD_JYXZL)) {
				prjQuatPrps = PrjQuatPrpsVOTransform.toVO(prjQuatPrpsXNYApiService.prjQuatPrpsCalculateForJYXZL(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
			} else {
				if (StringUtils.isNotBlank(prjQuatPrps.getInsCode()) && prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_SPD)) {//浦发接口
					// TODO 浦发 测算 新能源汽车
					prjQuatPrps = prjQuatPrpsCalculateForZGPF(prjQuatPrps);
				} else if (StringUtils.isNotBlank(prjQuatPrps.getInsCode()) && prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_TYFL)) {
					// 天银租赁
					prjQuatPrps = PrjQuatPrpsVOTransform.toVO(this.insQuatPrpsAndPrdSchMApiService.prjQuatPrpsCalculateForZG(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
				} else if (PrjBscInfoConstant.PRJ_TYP_CD_ZCSS.equals(prjBsc.getPrjTypCd())) {
					prjQuatPrps = PrjQuatPrpsVOTransform.toVO(this.prjQuatPrpsApiService.prjQuatPrpsCalculateForNewEnergyZCSS(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
				} else {
					prjQuatPrps = prjQuatPrpsCalculateForNewEnergy(prjQuatPrps);
				}
			}
		/*}else{
			prjQuatPrps  = prjQuatPrpsCalculateForNormal(prjQuatPrps);
		}*/
		} else if (prjBsc.getBuOrgCd().equals(PrjBscInfoConstant.CODE_BU_ORG_CD_ZK) && StringUtils.isNotBlank(prjBsc.getInsCode()) && prjBsc.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_ICBC)) {
			//判断是否含有上装贷
			if (null != prjBsc.getIsHaveUpStruct() && prjBsc.getIsHaveUpStruct() == BaseConstant.IS_YESNO_YES) {
				prjQuatPrps = prjQuatPrpsCalculateForZKGHNew(prjQuatPrps);
			} else {
				prjQuatPrps = prjQuatPrpsCalculateForZKGH(prjQuatPrps);
			}
	/*	}else if(prjBsc.getBuOrgCd().equals(PrjBscInfoConstant.CODE_BU_ORG_CD_ZK)&&StringUtils.isNotBlank(prjBsc.getPrjTypCd())&&
				(prjBsc.getPrjTypCd().equals(PrjBscInfoConstant.PRJ_TYP_CD_CSYWCP)||prjBsc.getPrjTypCd().equals(PrjBscInfoConstant.PRJ_TYP_CD_CSYWCT))){
              prjQuatPrps  = prjQuatPrpsCalculateForZKCSYW(prjQuatPrps);*/
		} else if (((prjBsc.getBuOrgCd().equals(PrjBscInfoConstant.CODE_BU_ORG_CD_ZK)) || prjBsc.getBuOrgCd().equals(PrjBscInfoConstant.CODE_BU_ORG_CD_ZC)) && StringUtils.isNotBlank(prjQuatPrpsCfgM.getPrpsPrdTypCd()) && (prjQuatPrpsCfgM.getPrpsPrdTypCd().equals(PrjQuatPrpsCfgMConstant.CODE_PRJ_QUAT_PRPS_PRD_TYP_CD))) {
			/*if(StringUtils.isNotBlank(prjQuatPrps.getInsCode()) && prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_SN)){ // 暂时先写sn
				prjQuatPrps  = prjQuatPrpsCalculateForZGSN(prjQuatPrps);
			}else*/
			if (StringUtils.isNotBlank(prjQuatPrps.getInsCode()) && prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_SPD)) {//浦发接口
				// 浦发 测算
				prjQuatPrps = prjQuatPrpsCalculateForZGPF(prjQuatPrps);
			} else if (StringUtils.isNotBlank(prjQuatPrps.getInsCode()) &&
					(prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_ZYFL)
							|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_CCFL)
							|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_SMBC))) {
				//浙银金租 、微众、三井住友、长城 普通PMT
				prjQuatPrps = caclZGTraditionPMT(prjQuatPrps);
			} else if (StringUtils.isNotBlank(prjQuatPrps.getInsCode()) && (
					//江西银行 测算
					prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_JXBANK)
					//众邦银行 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_ZBBANK)
					//众邦银行二手车 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_ZBBANKX)
					//新网银行 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_XWBANK)
					//兴邦金租 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_XBFL)
					//江西金租 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_JXFL)
					//华润银行 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_HRBANK)
					//江西裕民银行 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_JXYMBANK)
					//亿联银行 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_YLBANK)
					//中国工商银行青岛城阳支行 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_ICBCQD)
					//三湘银行 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_SXBANK)
					//青岛工行 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_QDGHBANK)
					//中国建设银行股份有限公司深圳分行 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_CCBANK)
					//中国建设银行股份有限公司深圳分行 二期 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_CCBANKTB)
					//上海银行 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_SHBANK)
					//中关村银行 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_ZGCBANK)
					//新邮储银行 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_XYCBANK)
					//宜宾银行 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_YBBANK)
					//上海农商银行 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_SHNS)
					//兴业金租 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_XYFL)
					//三一金租 测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_SYFL)
					//越秀金租 重卡测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_YXFL)
					//渤海银行 重卡测算
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_BHBANK)
					//工行淄博
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_ICBCYT)
					//工行烟台
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_ICBCZB)
					//苏宁银行
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_SNBANKS)
					//天银租赁
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_TYFL)
					// 安鹏金租
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_APFL)
					//微众银行
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_WEBANK)
					//天津银行
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_TIANJINBANK)
					//上实租赁
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_SSFL)
					//平安银行合肥分行
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_PABANK)
					//中国银行股份有限公司包头分行
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_BOCBTBANK)
					//上海浦东发展银行股份有限公司天津分行
					|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_SPDBANKDE)
			)) {
				prjQuatPrps = PrjQuatPrpsVOTransform.toVO(this.insQuatPrpsAndPrdSchMApiService.prjQuatPrpsCalculateForZG(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
			} else {
				prjQuatPrps = prjQuatPrpsCalculateForZG(prjQuatPrps);
			}
		} else if ((prjBsc.getBuOrgCd().equals(PrjBscInfoConstant.CODE_BU_ORG_CD_YC) || prjBsc.getBuOrgCd().equals(PrjBscInfoConstant.CODE_BU_ORG_CD_ZK)) && payWayCd.equals(PrjQuatPrpsConstant.CODE_MULTI__STEP_INTER)) {
			prjQuatPrps = prjQuatPrpsCalculateForYCLadder(prjQuatPrps);
		} else if((prjBsc.getBuOrgCd().equals(PrjBscInfoConstant.CODE_BU_ORG_CD_YC)) && StringUtils.isNotBlank(prjQuatPrpsCfgM.getPrpsPrdTypCd()) && (prjQuatPrpsCfgM.getPrpsPrdTypCd().equals(PrjQuatPrpsCfgMConstant.CODE_PRJ_QUAT_PRPS_PRD_TYP_CD))){
		   if (StringUtils.isNotBlank(prjQuatPrps.getInsCode()) && (
				prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_XYFL) // 兴业金租 测算
				|| prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_SYFL) // 三一金租 测算
                || 	prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_HRBANK) // 华润银行 测算
                || 	prjQuatPrps.getInsCode().equals(PrjBscInfoConstant.PRJ_INS_CODE_WEBANK) // 微众银行 测算
           )){
			    prjQuatPrps = PrjQuatPrpsVOTransform.toVO(this.insQuatPrpsAndPrdSchMApiService.prjQuatPrpsCalculateForZG(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
			}
		}else{
		 List<PrjQuatPrpsPaySchVO> prjQuatPrpsPaySchList = new ArrayList<PrjQuatPrpsPaySchVO>();
		 List<PrjQuatPrpsPaySchVO> prjPayList = new ArrayList<PrjQuatPrpsPaySchVO>();
		 List<PrjQuatPrpsPaySchVO> tempPayList = new ArrayList<PrjQuatPrpsPaySchVO>();
		 List<PrjQuatPrpsPaySchVO> prjQuatPayList = null;
			 double  totalRntAmt = 0d;//合计租金
			 double  totalPrinAmt = 0d;//合计本金
			 double  totalIntAmt = 0d;//合计利息
			 double totalRemPrinAmt = 0d;//合计剩余本金
			 double firstPayAmt = 0d;//首付款
			 boolean isBegiEqualFlag = false;//计算时是否是按期初等额本息计算第一期利息
			List<PrjQuatPrpsPaySchVO> payList = prjQuatPrps.getPrjQuatPrpsPaySchList();
		 int lsPd =0;//租期
		 double MonthRate = 0d;//月利率
		 if(null!=prjQuatPrps){
			 if(null==prjQuatPrps.getLsPd()||prjQuatPrps.getLsPd().intValue()==0){
					throw new BaseException(BaseExceptionConstant.BASE_EXCEPTION_CODE_600,"租期不能为空！");
			 }
		/*	 if(null==prjQuatPrps.getAnnIntRatePct()){
					throw new BaseException(BaseExceptionConstant.BASE_EXCEPTION_CODE_600,"年利率不能为空！");
			 }*/
			 int feeScale = 0; //费用小数位
			 int annIntScale = 0; //年利率小数位
			 int floatScale = 0; //上浮小数位数
			//根据事业部获取小数位数
			Map<String,String> decDigitsMap =  this.getDecimalDigitsByBuOrgCodeNew(prjBsc.getCstMgrOrgCd());
			 if(!decDigitsMap.isEmpty()){
				 annIntScale = Integer.valueOf(decDigitsMap.get(PrjQuatPrpsConstant.CODE_ANNINT_RATE_NUM_CD));
				 floatScale = Integer.valueOf(decDigitsMap.get(PrjQuatPrpsConstant.CODE_FLOAT_RATE_NUM_CD));
				 feeScale =  Integer.valueOf(decDigitsMap.get(PrjQuatPrpsConstant.CODE_FEE_DECI_NUM_CD));
			 }else{
				 //没有查询到默认按10小数计算
				 feeScale = PrjQuatPrpsConstant.CODE_FEE_DECI_DEF_NUM; //费用小数位
				 annIntScale = PrjQuatPrpsConstant.CODE_ANNINT_RATE_DEF_NUM; //年利率小数位
				 floatScale = PrjQuatPrpsConstant.CODE_FLOAT_RATE_DEF_NUM; //上浮小数位数
			 }

			lsPd = prjQuatPrps.getLsPd().intValue();
			//月利率= 年利率/12
			MonthRate = DecimalUtils.div(DecimalUtils.round(prjQuatPrps.getAnnIntRatePct(), annIntScale),12);
			double dowePay = 0d;//首期租金
			double finacAmt = 0d;//融资额
			 double chlDpstAmt = 0d ;// 渠道担保保证金金额
			 //方案费用明细
			 if(CollectionUtils.isNotEmpty(prjQuatPrps.getPrjQuatPrpsFeelist())){
			//首期租金
			double firstRntAmt = 0d;
			for (PrjQuatPrpsFeeVO firstDetail : prjQuatPrps.getPrjQuatPrpsFeelist()) {
				if(firstDetail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_DOWNPAY)){
					firstRntAmt = ProjectUtils.getFirstAmt(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),firstDetail.getCalBaseCd(),firstDetail.getFeePct());
				}
				if ((PrjQuatPrpsFeeConstant.FEE_TYP_CD_117.equals(firstDetail.getFeeTypCd()) || PrjQuatPrpsFeeConstant.FEE_TYP_CD_118.equals(firstDetail.getFeeTypCd())) && firstDetail.getFeeAmt() > 0){
					chlDpstAmt = firstDetail.getFeeAmt() ;
				}
			}
			for (int i=0; i<prjQuatPrps.getPrjQuatPrpsFeelist().size();i++) {
				PrjQuatPrpsFeeVO detail  = prjQuatPrps.getPrjQuatPrpsFeelist().get(i);
				if(detail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_DOWNPAY)){
					dowePay =DecimalUtils.round(ProjectUtils.getFirstAmt(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),detail.getCalBaseCd(), DecimalUtils.round(detail.getFeePct(),feeScale)), 0);
					firstPayAmt=DecimalUtils.add(dowePay, firstPayAmt);
					continue;
				}
				//留购价要乘以产品数量
			/*	if(detail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_PURCH_PRICE)){
					double purchPrice =0d;
					PrjPrdBscInfoQueryCondition prdQc = new PrjPrdBscInfoQueryCondition();
					if(StringUtils.isNotEmpty(prjQuatPrps.getPrjId())){
						prdQc.setPrjId(prjQuatPrps.getPrjId());
						List<PrjPrdBscInfoVO> prdList=	this.prjPrdBscInfoService.searchList(prdQc);
						if(CollectionUtils.isNotEmpty(prdList)){
							for (PrjPrdBscInfoVO prjPrdBscInfoVO : prdList) {
								purchPrice = DecimalUtils.add(purchPrice, DecimalUtils.mul(detail.getFeeAmt(), prjPrdBscInfoVO.getPrdQty(),0)) ;
							}
						}
					}
					if(detail.getCntWayCd().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CNT_WAY_DOWNPAY)){
						firstPayAmt=DecimalUtils.add(purchPrice, firstPayAmt);
					}
					if(detail.getCntWayCd().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CNT_WAY_FINANC)){
						finacAmt=DecimalUtils.add(purchPrice, finacAmt);
					}
					continue;
				}*/
				//除去留购价和首期租金的其他费用
				if(/*!detail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_PURCH_PRICE)&&*/!detail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_DOWNPAY)){
				if(detail.getCntWayCd().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CNT_WAY_DOWNPAY)){
					//计入首期款的费用项
					if(detail.getIsFixedAmt().equals(BaseConstant.IS_YESNO_NO)){
						//按比计算
						double amt = DecimalUtils.round(ProjectUtils.getAmtByCalBase(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),firstRntAmt,detail.getCalBaseCd(),DecimalUtils.round(detail.getFeePct(),feeScale)),0);
						detail.setFeeAmt(amt);
						firstPayAmt=DecimalUtils.add(amt, firstPayAmt);
					}else{
						//固定值
						firstPayAmt=DecimalUtils.add(detail.getFeeAmt(), firstPayAmt);
					}
					continue;
				}
				if(detail.getCntWayCd().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CNT_WAY_FINANC)){
					//计入融资额的费用项
					if(null!=detail.getFeePct()){
						//按比计算
						double amt =  DecimalUtils.round(ProjectUtils.getAmtByCalBase(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),firstRntAmt,detail.getCalBaseCd(),DecimalUtils.round(detail.getFeePct(),feeScale)),0);
						detail.setFeeAmt(amt);
						finacAmt=DecimalUtils.add(amt, finacAmt);
					}else{
						//固定值
						finacAmt=DecimalUtils.add(detail.getFeeAmt(), finacAmt);
					}
				}
				}

			}

		}

		//融资额 = 合同额-首期租金
		finacAmt = DecimalUtils.add(finacAmt, DecimalUtils.sub(prjQuatPrps.getContAmt(), dowePay));//实际融资额
		prjQuatPrps.setActLsAmt(finacAmt);
		double afterFirstRemPrinAmt = 0d;//第一期后的剩余本金
		 if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_END_NO_EQUAL)||prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_BEGI_NO_EQUAL)){
			 //不等额计算 期末不等额（暂时不考虑期初不等额）
			 Map<Integer, Double> rntMap = new HashMap<Integer, Double>();
			 Map<Integer, Integer> modifyFlagMap = new HashMap<Integer, Integer>();//设置是否修改状态
			 int type=0;
			 if(CollectionUtils.isNotEmpty(payList)){
				 this.sortPrjPayList(payList);
				 if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_BEGI_NO_EQUAL)){
					 type = 1;
					 isBegiEqualFlag = true;
				 }
				 if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_END_NO_EQUAL)){
					 type = 0;
				 }
				 for (PrjQuatPrpsPaySchVO prjQuatPrpsPaySchVO : payList) {
					 if(null==prjQuatPrpsPaySchVO.getIsModify()||prjQuatPrpsPaySchVO.getIsModify().equals(BaseConstant.IS_YESNO_NO)){
						 modifyFlagMap.put(prjQuatPrpsPaySchVO.getPayPd().intValue(), BaseConstant.IS_YESNO_NO);
					 }else{
						 modifyFlagMap.put(prjQuatPrpsPaySchVO.getPayPd().intValue(), BaseConstant.IS_YESNO_YES);
					 }
					if(null!=prjQuatPrpsPaySchVO.getIsModify()&&prjQuatPrpsPaySchVO.getIsModify().equals(BaseConstant.IS_YESNO_YES)){
						rntMap.put(prjQuatPrpsPaySchVO.getPayPd().intValue(), prjQuatPrpsPaySchVO.getRntAmt());
					}
				}
			 }
			 /**
				 * 不等额每期租金
				 * @author Ricky
				 * @param nPer 期数
				 * @param pv 现值 /融资额
				 * @param rate 期利率
				 * @param ueBaseAmts <不等额期次，不等额还款金额>
				 * @return 不等额每期租金
				 */
			double[] rntList =  ProjectUtils.getUnequalPmt(prjQuatPrps.getLsPd().intValue(),finacAmt,DecimalUtils.div(MonthRate, 100),rntMap);
			for(int i=1;i<=lsPd;i++){
	 			 PrjQuatPrpsPaySchVO pay = new PrjQuatPrpsPaySchVO();
	 			 pay.setPayPd(Long.valueOf(i));
	 			 	double  rntAmt = 0d;//租金
	 				double  prinAmt = 0d;//本金
	 				double  intAmt = 0d;//利息
	 				double remPrinAmt = 0d;//剩余本金
	 					//租金
	 					rntAmt = DecimalUtils.round(rntList[i-1],0);
	 					if(i==1){
	 						//第一期利息为0
	 						if(isBegiEqualFlag){
	 							intAmt = 0;
	 						}else{
	 							intAmt =DecimalUtils.round( DecimalUtils.mul(finacAmt, DecimalUtils.div(MonthRate, 100)),0);
	 						}
	 						//本金
	 						prinAmt = DecimalUtils.sub(rntAmt, intAmt);
	 						//剩余本金
	 						remPrinAmt = DecimalUtils.sub(finacAmt, prinAmt);
	 						afterFirstRemPrinAmt = remPrinAmt;
	 						prjQuatPrps.setEachEstRntAmt(rntAmt);
	 					}else if(i==lsPd){
	 						//最后一期本金=上一期的剩余本金
	 						prinAmt = afterFirstRemPrinAmt;
	 						//利息=租金-本金
	 						intAmt =DecimalUtils.sub(rntAmt, prinAmt);
	 						//最后一期剩余本金=0
	 						remPrinAmt = 0;
	 						afterFirstRemPrinAmt = remPrinAmt;
	 					}else{
	 						//利息
	 						intAmt = DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)),0);
	 						//本金
	 						prinAmt = DecimalUtils.sub(rntAmt, intAmt);
	 						//剩余本金= 上一期的剩余本金-本金
	 					    remPrinAmt = DecimalUtils.sub(afterFirstRemPrinAmt, prinAmt);
	 						afterFirstRemPrinAmt = remPrinAmt;
	 					}
	 				 totalRntAmt = DecimalUtils.add(totalRntAmt, rntAmt);
	 				 totalPrinAmt = DecimalUtils.add(totalPrinAmt, prinAmt);
	 				 totalIntAmt = DecimalUtils.add(totalIntAmt, intAmt);
	 				 totalRemPrinAmt = DecimalUtils.add(totalRemPrinAmt, remPrinAmt);
	 				pay.setIntAmt(intAmt);
	 				pay.setRemPrinAmt(remPrinAmt);
	 				pay.setRntAmt(rntAmt);
	 				pay.setPrinAmt(prinAmt);
	 				pay.setIsModify(modifyFlagMap.get(i));
	 				prjQuatPrpsPaySchList.add(pay);
	 				prjQuatPrps.setIsModify(BaseConstant.IS_YESNO_YES);//设置为可以修改
	 		 }
			 /*	 int type=0;
			 if(CollectionUtils.isNotEmpty(payList)){
				 if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_BEGI_NO_EQUAL)){
					 type = 1;
					 isBegiEqualFlag = true;
				 }
				 if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_END_NO_EQUAL)){
					 type = 0;
				 }
				 //查找修改后的剩余本金
				 for (int i=0;i<payList.size();i++) {
					 PrjQuatPrpsPaySchVO pay = new PrjQuatPrpsPaySchVO();
					 PrjQuatPrpsPaySchVO prjQuatPrpsPaySchVO = payList.get(i);
					 pay.setPayPd(prjQuatPrpsPaySchVO.getPayPd());
					 pay.setIsModify(prjQuatPrpsPaySchVO.getIsModify());
					double remPrinAmt = 0d;
					 double rntAmt =0d;
					double intAmt = 0d;
					 double prinAmt = 0d;
						 if(prjQuatPrpsPaySchVO.getIsModify().equals(BaseConstant.IS_YESNO_YES)){
							 //期初不等额 第一期
							 if(prjQuatPrpsPaySchVO.getPayPd()==1){
								 if(isBegiEqualFlag){
									 intAmt = 0d;//第一期的利息为0
								 }else{
									  intAmt = DecimalUtils.round(DecimalUtils.mul(finacAmt, DecimalUtils.div(MonthRate, 100)),0);//利息
								 }
								  rntAmt =  prjQuatPrpsPaySchVO.getRntAmt();//租金
								  prinAmt = DecimalUtils.sub(rntAmt, intAmt);
								 //剩余本金
								 remPrinAmt = DecimalUtils.sub(finacAmt, prinAmt);
								 afterFirstRemPrinAmt = remPrinAmt;
							 }else{
								 //利息=上一期的剩余本金*月利率
								  intAmt =DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)),0);//利息
								  rntAmt =  prjQuatPrpsPaySchVO.getRntAmt();//租金
								  prinAmt = DecimalUtils.sub(rntAmt, intAmt);//本金
								 //剩余本金
								  remPrinAmt = DecimalUtils.sub(afterFirstRemPrinAmt, prinAmt);
								 afterFirstRemPrinAmt = remPrinAmt;
							 }
						 }else{
							 if(prjQuatPrpsPaySchVO.getPayPd()==1){
								 if(isBegiEqualFlag){
									 intAmt = 0d;//第一期的利息为0
								 }else{
									  intAmt = DecimalUtils.round(DecimalUtils.mul(finacAmt, DecimalUtils.div(MonthRate, 100)),0);//利息
								 }
								  rntAmt = 0;
								  prinAmt = DecimalUtils.sub(rntAmt, intAmt);
								 //剩余本金
								 remPrinAmt = DecimalUtils.sub(finacAmt, prinAmt);
								 afterFirstRemPrinAmt = remPrinAmt;
							 }else{
								  rntAmt = 0;
								 //利息=上一期的剩余本金*月利率
								  intAmt = DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)),0);//利息
								  prinAmt = DecimalUtils.sub(rntAmt, intAmt);//本金
								 //剩余本金
								  remPrinAmt = DecimalUtils.sub(afterFirstRemPrinAmt, prinAmt);
								  afterFirstRemPrinAmt = remPrinAmt;
							 }
						 }
					pay.setIntAmt(intAmt);
					pay.setRemPrinAmt(remPrinAmt);
					pay.setRntAmt(rntAmt);
					pay.setPrinAmt(prinAmt);
					prjPayList.add(pay);
				}
				if(prjPayList.size()>0){
					sortPrjPayList(prjPayList);
				}

				 //使用内差法配平
				 boolean forceBreak = false;
					double y=0,x,c=0,jd = 0.0000001,side=-1;
					double minDeviation=1;
					//double lastPrice = modifyCount==1?finacAmt:modifyLastAmt;
					double lastPrice =  finacAmt;
					do{
						double _lastPrice = lastPrice,ownPriceSum = 0d;
						List<PrjQuatPrpsPaySchVO> list = new ArrayList<PrjQuatPrpsPaySchVO>();
					double firstRemPrice=0d;
					double totalPrintAmt=0d;
					Map<Long,PrjQuatPrpsPaySchVO> map = new HashMap<Long,PrjQuatPrpsPaySchVO> ();
					for(int i=0;i<prjPayList.size();i++){
						PrjQuatPrpsPaySchVO pay = prjPayList.get(i);
						double rntAmt = pay.getIsModify()==1?pay.getRntAmt():(pay.getRntAmt()+y);//租金
						if(pay.getIsModify()!=BaseConstant.IS_YESNO_NO){
							prjQuatPrps.setEachEstRntAmt(rntAmt);
						}
						double intAmt =0d;
						if(pay.getPayPd()==1){
							if(isBegiEqualFlag){
								intAmt = 0;
							}else{
								intAmt = DecimalUtils.round(finacAmt*DecimalUtils.div(MonthRate, 100),0);//利息
							}
						}else{
							intAmt = DecimalUtils.round(map.get((pay.getPayPd()-1l)).getRemPrinAmt()*DecimalUtils.div(MonthRate, 100),0);//利息
						}
						double prinAmt = DecimalUtils.sub(rntAmt, intAmt);//本金
					 		if(pay.getPayPd()==1){
									firstRemPrice = finacAmt-prinAmt;
								}else{
									firstRemPrice = map.get((pay.getPayPd()-1l)).getRemPrinAmt()-prinAmt;
								}
					 			   totalPrintAmt = DecimalUtils.add(prinAmt, totalPrintAmt);
						           pay.setRemPrinAmt(firstRemPrice);
						           pay.setRntAmt(rntAmt);
						           pay.setPrinAmt(prinAmt);
						           pay.setIntAmt(intAmt);
						ownPriceSum=DecimalUtils.add(ownPriceSum, prinAmt);
						list.add(pay);
						map.put(pay.getPayPd(), pay);
					}

						//计算误差
					x = DecimalUtils.sub(firstRemPrice,0);
						//初始化内差值，当误差大于0时为增，否则为减
						if(side==-1)side=x>0?0.1:-0.1;
						//调整内差值，以及精度
						if(x*side>0){
							side = -side;
							if(jd==10){
								//如果最小误差两次一样，退出计算
								if(minDeviation==Math.abs(x)){
									prjQuatPayList = list;
									break;
								}
								//保存最小误差
								if(minDeviation>Math.abs(x))minDeviation=Math.abs(x);
							}else{
								jd *=10;
							}
						}
//						//重新设定配平参数
		    			y = -side / jd;
		    			//运算1000次，如果出现运算1000次以后还不能配平的，把它增大即可。
					}while(!forceBreak&&Math.abs(x)>0.01&&c++<1000);
				}
			 //配平最后一分钱
			 if(CollectionUtils.isNotEmpty(prjQuatPayList)){
				 List<PrjQuatPrpsPaySchVO> payQuatList = new ArrayList<PrjQuatPrpsPaySchVO>();
				 double totalPrintAmt = 0d;
				 for (int i=0;i<prjQuatPayList.size();i++) {
					 PrjQuatPrpsPaySchVO prjQuatPrpsPaySchVO = prjQuatPayList.get(i);
					 if(prjQuatPrpsPaySchVO.getPayPd().intValue()==prjQuatPrps.getLsPd()){
						 double amt = DecimalUtils.sub(finacAmt, totalPrintAmt);
						 prjQuatPrpsPaySchVO.setPrinAmt(amt);
					 }else{
						 totalPrintAmt = DecimalUtils.add(totalPrintAmt, prjQuatPrpsPaySchVO.getPrinAmt());
					 }
					 payQuatList.add(prjQuatPrpsPaySchVO);
					 //合计本金、利息、租金信息
						totalRntAmt = DecimalUtils.add(totalRntAmt, prjQuatPrpsPaySchVO.getRntAmt());
						totalPrinAmt = DecimalUtils.add(totalPrinAmt, prjQuatPrpsPaySchVO.getPrinAmt());
						totalIntAmt = DecimalUtils.add(totalIntAmt, prjQuatPrpsPaySchVO.getIntAmt());
						totalRemPrinAmt = 0;
				}
				 prjQuatPrpsPaySchList = payQuatList;
				 sortPrjPayList(prjQuatPrpsPaySchList);
			 }
			 //使用内插法没找到值，使用相应的等额方式计算，重新修改测算
			 if(CollectionUtils.isEmpty(prjQuatPrpsPaySchList)){
				 			for(int i=1;i<=lsPd;i++){
				 			 PrjQuatPrpsPaySchVO pay = new PrjQuatPrpsPaySchVO();
				 			 pay.setPayPd(Long.valueOf(i));
				 			 	double  rntAmt = 0d;//租金
				 				double  prinAmt = 0d;//本金
				 				double  intAmt = 0d;//利息
				 				double remPrinAmt = 0d;//剩余本金
				 //-----------------------------------------等额本息(期初/期末)----------------------------------------------------------------------//
				 					//租金
				 					rntAmt = DecimalUtils.round(DecimalUtils.round(ProjectUtils.getPMT(DecimalUtils.div(MonthRate, 100), lsPd, finacAmt, 0, type),0),0);
				 					if(i==1){
				 						//第一期利息为0
				 						if(isBegiEqualFlag){
				 							intAmt = 0;
				 						}else{
				 							intAmt =DecimalUtils.round( DecimalUtils.mul(finacAmt, DecimalUtils.div(MonthRate, 100)),0);
				 						}
				 						//本金
				 						prinAmt = DecimalUtils.sub(rntAmt, intAmt);
				 						//剩余本金
				 						remPrinAmt = DecimalUtils.sub(finacAmt, prinAmt);
				 						afterFirstRemPrinAmt = remPrinAmt;
				 						prjQuatPrps.setEachEstRntAmt(rntAmt);
				 					}else if(i==lsPd){
				 						//利息=上一期的剩余本金*月利率
				 						intAmt =DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)),0);
				 						//最后一期本金=上一期的剩余本金
				 						prinAmt = afterFirstRemPrinAmt;
				 						//最后一期剩余本金=0
				 						remPrinAmt = 0;
				 						afterFirstRemPrinAmt = remPrinAmt;
				 					}else{
				 						//利息
				 						intAmt = DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)),0);
				 						//本金
				 						prinAmt = DecimalUtils.sub(rntAmt, intAmt);
				 						//剩余本金= 上一期的剩余本金-本金
				 					    remPrinAmt = DecimalUtils.sub(afterFirstRemPrinAmt, prinAmt);
				 						afterFirstRemPrinAmt = remPrinAmt;
				 					}
				 				 totalRntAmt = DecimalUtils.add(totalRntAmt, rntAmt);
				 				 totalPrinAmt = DecimalUtils.add(totalPrinAmt, prinAmt);
				 				 totalIntAmt = DecimalUtils.add(totalIntAmt, intAmt);
				 				 totalRemPrinAmt = DecimalUtils.add(totalRemPrinAmt, remPrinAmt);
				 				pay.setIntAmt(intAmt);
				 				pay.setRemPrinAmt(remPrinAmt);
				 				pay.setRntAmt(rntAmt);
				 				pay.setPrinAmt(prinAmt);
				 				pay.setIsModify(BaseConstant.IS_YESNO_NO);
				 				prjQuatPrpsPaySchList.add(pay);
				 				prjQuatPrps.setIsModify(BaseConstant.IS_YESNO_YES);//设置为可以修改
				 				prjQuatPrps.setIsHaveException(BaseConstant.IS_YESNO_YES);
				 		 }
			 }*/
			 tempPayList = prjQuatPrpsPaySchList;
		 }else{
		if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_MULTI__STEP_INTER)){
			 //阶梯还款
			//-----------------------------------------阶梯还款----------------------------------------------------------------------//
			 /**
			  * 先按期末等额本息计算，然后乘以相应的比例
			  */
			 int perPd = 0;//每6期为一个阶梯
			List<KeyValueVO>  list = this.sysDictionaryApiService.getKvList(DictionaryConstant.CODE_QUAT_PER_PCT_CD, CurrentThreadContext.getCurrentSysCd(), prjBsc.getCstMgrOrgCd());
			Map<Integer, Double> map = new HashMap<Integer, Double>();
			for (KeyValueVO keyValueVO : list) {
				String[] valueStr = keyValueVO.getKey().split("-");
				perPd = Integer.valueOf(valueStr[1]);
				map.put(Integer.valueOf(valueStr[2]), Double.valueOf(keyValueVO.getValue()));
			}
			 double lastAmt = 0d;
			 for(int j=1;j<=lsPd;j++){
				 PrjQuatPrpsPaySchVO pay = new PrjQuatPrpsPaySchVO();
				 PrjQuatPrpsPaySchVO tmpPay = new PrjQuatPrpsPaySchVO();
				 pay.setPayPd(Long.valueOf(j));
				 tmpPay.setPayPd(Long.valueOf(j));
				 double  baseRntAmt = DecimalUtils.round(ProjectUtils.getPMT(DecimalUtils.div(MonthRate, 100), lsPd, finacAmt, 0, 0),PrjQuatPrpsConstant.CODE_FEE_DECI_DEF_NUM);
				 int tmp = (j-1)/perPd+1;
				 double pct = map.get(tmp);
				 double rntAmt = 0d;
				 double prinAmt = 0d;
				 double intAmt = 0d;
				 double remPrinAmt = 0d;
				 double tmpRntAmt = 0d;
				 double tmpPrinAmt = 0d;
				 double tmpIntAmt = 0d;
				 double tmpRemPrinAmt = 0d;

				 rntAmt = DecimalUtils.round(DecimalUtils.mul(baseRntAmt, pct),0);//租金
				tmpRntAmt =DecimalUtils.round(DecimalUtils.mul(baseRntAmt, pct),PrjQuatPrpsConstant.CODE_FEE_DECI_DEF_NUM);
				 if(j==1){
					//利息 = 融资额*月利率
						intAmt = DecimalUtils.round(DecimalUtils.mul(finacAmt, DecimalUtils.div(MonthRate, 100)),0);
						//本金
						prinAmt = DecimalUtils.sub(rntAmt, intAmt);
					//剩余本金
						remPrinAmt = DecimalUtils.sub(finacAmt, prinAmt);
						lastAmt = remPrinAmt;
						prjQuatPrps.setEachEstRntAmt(baseRntAmt);
				 }else if(j==lsPd){
					//本金
					prinAmt = lastAmt;
					//最后一期的本金等于剩余本金
					 //利息 = 融资额*月利率
					 intAmt = DecimalUtils.sub(rntAmt, prinAmt);
					remPrinAmt = 0d;
					 lastAmt = remPrinAmt;
				 }else{
					//利息 = 融资额*月利率
					intAmt = DecimalUtils.round(DecimalUtils.mul(lastAmt, DecimalUtils.div(MonthRate, 100)),0);
					//本金
					prinAmt = DecimalUtils.sub(rntAmt, intAmt);
					//剩余本金
					 remPrinAmt = DecimalUtils.sub(lastAmt, prinAmt);
					 lastAmt = remPrinAmt;
				 }
				 	totalRntAmt = DecimalUtils.add(totalRntAmt, rntAmt);
					totalPrinAmt = DecimalUtils.add(totalPrinAmt, prinAmt);
					 totalIntAmt = DecimalUtils.add(totalIntAmt, intAmt);
					 totalRemPrinAmt = DecimalUtils.add(totalRemPrinAmt, remPrinAmt);
					pay.setIntAmt(intAmt);
					pay.setRemPrinAmt(remPrinAmt);
					pay.setRntAmt(rntAmt);
					pay.setPrinAmt(prinAmt);
					pay.setIsModify(BaseConstant.IS_YESNO_NO);
					prjQuatPrpsPaySchList.add(pay);
					tmpPay.setRntAmt(tmpRntAmt);
					tempPayList.add(tmpPay);
			 }

		}else if(!(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.PAY_WAY_CD_19)
                || prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.PAY_WAY_CD_20)
                || prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.PAY_WAY_CD_21))){
			double totalAmt = 0d;//每期的本金和
			double totalRnt = 0d;//每期租金和
			for(int i=1;i<=lsPd;i++){
				PrjQuatPrpsPaySchVO pay = new PrjQuatPrpsPaySchVO();
				PrjQuatPrpsPaySchVO tmpPay = new PrjQuatPrpsPaySchVO();
				tmpPay.setPayPd(Long.valueOf(i));
				pay.setPayPd(Long.valueOf(i));
				double  rntAmt = 0d;//租金
				double  prinAmt = 0d;//本金
				double  intAmt = 0d;//利息
				double remPrinAmt = 0d;//剩余本金

				double  tmpRntAmt = 0d;//租金
				double  tmpPrinAmt = 0d;//本金
				double  tmpIntAmt = 0d;//利息
				double tmpRemPrinAmt = 0d;//剩余本金

				//-----------------------------------------等额期初/期末本金计算----------------------------------------------------------------------//
				if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_BEGI_EQUAL__PRINC)
						||prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_END_EQUAL__PRINC)){
					//本金=融资额/租期
					prinAmt =DecimalUtils.round( DecimalUtils.div(finacAmt, lsPd),0);
					if(i==1){
						//第一期的利息为0
						intAmt = 0;
						totalAmt = DecimalUtils.add(prinAmt, totalAmt);

						//第一期的剩余本金=融资额-本金
						remPrinAmt = DecimalUtils.sub(finacAmt, prinAmt);
						afterFirstRemPrinAmt = remPrinAmt;
						rntAmt = DecimalUtils.add(prinAmt, intAmt);
						totalRnt =  DecimalUtils.add(rntAmt, totalRnt);
						prjQuatPrps.setEachEstRntAmt(rntAmt);
					}else if(i==lsPd){
						//最后一期的本金
						//prinAmt = finacAmt-totalAmt; 2017-02-28 修改
						intAmt = DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)),0);
						rntAmt = DecimalUtils.add(prinAmt, intAmt);
						/*	if(prjQuatPrps.getAnnIntRatePct().doubleValue()==0d){
							rntAmt = finacAmt-totalRnt;
						}else{
							rntAmt = DecimalUtils.add(prinAmt, intAmt);
						}*///2017-02-28 修改
						//最后一期剩余本金=0
						remPrinAmt = 0;
					}else{
						totalAmt = DecimalUtils.add(prinAmt, totalAmt);
						//利息= 月利率*上一期的剩余本金
						intAmt = DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)),0);
						//租金= 本金+利息
						rntAmt = DecimalUtils.add(prinAmt, intAmt);
						totalRnt =  DecimalUtils.add(rntAmt, totalRnt);
						//剩余本金= 上一期的剩余本金-本金
						remPrinAmt = DecimalUtils.sub(afterFirstRemPrinAmt, prinAmt);
						afterFirstRemPrinAmt = remPrinAmt;
					}


				}
//-----------------------------------------等额本息(期初/期末)----------------------------------------------------------------------//
				if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_BEGI_EQUAL__PRINC_INTER)){
					//期初等额本息
					//租金
					rntAmt =DecimalUtils.round(ProjectUtils.getPMT(DecimalUtils.div(MonthRate, 100), lsPd, finacAmt, 0, 1),0);
					tmpRntAmt =DecimalUtils.round(ProjectUtils.getPMT(DecimalUtils.div(MonthRate, 100), lsPd, finacAmt, 0, 1),PrjQuatPrpsConstant.CODE_FEE_DECI_DEF_NUM);

					if(i==1){
						//第一期利息为0
						intAmt = 0;
						//本金
						totalRnt =  DecimalUtils.add(rntAmt, totalRnt);
						prinAmt = DecimalUtils.sub(rntAmt, intAmt);
						//剩余本金
						remPrinAmt = DecimalUtils.sub(finacAmt, prinAmt);
						afterFirstRemPrinAmt = remPrinAmt;
						prjQuatPrps.setEachEstRntAmt(rntAmt);
					}else if(i==lsPd){
						//当年利率为0时，最后一期租金等于融资额-除去最后一期租金之和
						/*if(prjQuatPrps.getAnnIntRatePct().doubleValue()==0d){
							rntAmt = finacAmt-totalRnt;
						}*///2017-02-28 修改
						//利息=上一期的剩余本金*月利率
						intAmt = DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)),0);
						//最后一期本金=上一期的剩余本金
						if(prjQuatPrps.getAnnIntRatePct().doubleValue()!=0d){
							prinAmt = afterFirstRemPrinAmt;
						}else{
							prinAmt = DecimalUtils.sub(rntAmt, intAmt);
						}//2017-02-28 修改
						if(prinAmt>rntAmt){
							rntAmt = prinAmt;
						}
						//最后一期剩余本金=0
						remPrinAmt = 0;
						afterFirstRemPrinAmt = remPrinAmt;
					}else{
						totalRnt =  DecimalUtils.add(rntAmt, totalRnt);
						//利息
						intAmt = DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)),0);
						//本金
						prinAmt = DecimalUtils.sub(rntAmt, intAmt);
						//剩余本金= 上一期的剩余本金-本金
						remPrinAmt = DecimalUtils.sub(afterFirstRemPrinAmt, prinAmt);
						afterFirstRemPrinAmt = remPrinAmt;
					}
				}
				//期末等额本息
				if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_END_EQUAL__PRINC_INTER)){
					//租金
					rntAmt = DecimalUtils.round(ProjectUtils.getPMT(DecimalUtils.div(MonthRate, 100), lsPd, finacAmt, 0, 0),0);
					tmpRntAmt = DecimalUtils.round(ProjectUtils.getPMT(DecimalUtils.div(MonthRate, 100), lsPd, finacAmt, 0, 0),PrjQuatPrpsConstant.CODE_FEE_DECI_DEF_NUM);
					if(i==1){
						totalAmt = DecimalUtils.add(prinAmt, totalAmt);
						//利息 = 融资额*月利率
						intAmt = DecimalUtils.round(DecimalUtils.mul(finacAmt, DecimalUtils.div(MonthRate, 100)),0);
						//本金
						prinAmt = DecimalUtils.sub(rntAmt, intAmt);
						//剩余本金
						remPrinAmt = DecimalUtils.sub(finacAmt, prinAmt);
						afterFirstRemPrinAmt = remPrinAmt;
						prjQuatPrps.setEachEstRntAmt(rntAmt);
						totalRnt =  DecimalUtils.add(rntAmt, totalRnt);
					}else if(i==lsPd){
						/*if(prjQuatPrps.getAnnIntRatePct().doubleValue()==0d){
							rntAmt = finacAmt-totalRnt;
						}*///2017-02-28 修改
						//利息=上一期的剩余本金*月利率
						intAmt = DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)),0);
						//最后一期本金=上一期的剩余本金
						//最后一期本金=上一期的剩余本金
						if(prjQuatPrps.getAnnIntRatePct().doubleValue()!=0d){
							prinAmt = afterFirstRemPrinAmt;
						}else{
							prinAmt = DecimalUtils.sub(rntAmt, intAmt);
						}//2017-02-28 修改
						if(prinAmt>rntAmt){
							rntAmt = prinAmt;
						}
						//最后一期剩余本金=0
						remPrinAmt = 0;
						afterFirstRemPrinAmt = remPrinAmt;
					}else{
						totalAmt = DecimalUtils.add(prinAmt, totalAmt);
						//利息
						intAmt = DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)),0);
						//本金
						prinAmt = DecimalUtils.sub(rntAmt, intAmt);
						//剩余本金= 上一期的剩余本金-本金
						remPrinAmt = DecimalUtils.sub(afterFirstRemPrinAmt, prinAmt);
						afterFirstRemPrinAmt = remPrinAmt;
						totalRnt =  DecimalUtils.add(rntAmt, totalRnt);
					}
				}
				//-----------------------------------------平息法----------------------------------------------------------------------//

				if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_AVRGE__PRINC_INTER)){
					//平分本利
					//本金=融资额/租期
					prinAmt = DecimalUtils.round(DecimalUtils.div(finacAmt, lsPd),0);
					//利息
					intAmt =DecimalUtils.round(DecimalUtils.mul(finacAmt, DecimalUtils.div(MonthRate, 100)),0);
					//租金
					rntAmt = DecimalUtils.add(prinAmt, intAmt);
					if(i==1){
						remPrinAmt = DecimalUtils.sub(finacAmt, prinAmt);
						afterFirstRemPrinAmt = remPrinAmt;
						prjQuatPrps.setEachEstRntAmt(rntAmt);
					}else{
						remPrinAmt = DecimalUtils.sub(afterFirstRemPrinAmt, prinAmt);
						afterFirstRemPrinAmt = remPrinAmt;
					}
				}
				totalRntAmt = DecimalUtils.add(totalRntAmt, rntAmt);
				totalPrinAmt = DecimalUtils.add(totalPrinAmt, prinAmt);
				totalIntAmt = DecimalUtils.add(totalIntAmt, intAmt);
				totalRemPrinAmt = DecimalUtils.add(totalRemPrinAmt, remPrinAmt);
				pay.setIntAmt(intAmt);
				pay.setRemPrinAmt(remPrinAmt);
				pay.setRntAmt(rntAmt);
				pay.setPrinAmt(prinAmt);
				pay.setIsModify(BaseConstant.IS_YESNO_NO);
				prjQuatPrpsPaySchList.add(pay);

				tmpPay.setRntAmt(tmpRntAmt);
				tempPayList.add(tmpPay);
			}
		}
			 if (prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.PAY_WAY_CD_19)
					 || prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.PAY_WAY_CD_20)
					 || prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.PAY_WAY_CD_21)){
				 double rntAmt = DecimalUtils.round(ProjectUtils.getPMT(DecimalUtils.div(MonthRate, 100), lsPd, finacAmt, 0, 0), 0);
				 if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.PAY_WAY_CD_19)){
					 String speLsPd = prjQuatPrps.getSpeLsPd();
					 String[] speLsPdList = null;
					 if(StringUtils.isNotEmpty(speLsPd)){
						 speLsPdList = speLsPd.split(",");
					 }
					 for (int i = 1; i <= lsPd; i++) {
						 PrjQuatPrpsPaySchVO pay = new PrjQuatPrpsPaySchVO();
						 PrjQuatPrpsPaySchVO tmpPay = new PrjQuatPrpsPaySchVO();
						 tmpPay.setPayPd(Long.valueOf(i));
						 pay.setPayPd(Long.valueOf(i));
						 double prinAmt = 0d;//本金
						 double intAmt = 0d;//利息
						 double remPrinAmt = 0d;//剩余本金
						 double rntAmtDeal = DecimalUtils.div(rntAmt*lsPd,lsPd-2,0);
						 if (i == 1) {
							 //利息 = 融资额*月利率
							 intAmt = DecimalUtils.round(DecimalUtils.mul(finacAmt, DecimalUtils.div(MonthRate, 100)), 0);
							 //本金
							 prinAmt = DecimalUtils.sub(rntAmtDeal, intAmt);
							 //剩余本金
							 remPrinAmt = DecimalUtils.sub(finacAmt, prinAmt);
							 afterFirstRemPrinAmt = remPrinAmt;
							 prjQuatPrps.setEachEstRntAmt(rntAmtDeal);
						 } else if (i == lsPd) {
							 if (rntAmtDeal < afterFirstRemPrinAmt) {
								 rntAmtDeal = afterFirstRemPrinAmt;
							 }
							 prinAmt = afterFirstRemPrinAmt;
							 if (prjQuatPrps.getAnnIntRatePct().doubleValue() != 0d) {
								 intAmt = DecimalUtils.sub(rntAmtDeal, prinAmt);
							 } else {
								 intAmt = 0;
							 }
							 //最后一期剩余本金=0
							 remPrinAmt = 0;
							 afterFirstRemPrinAmt = remPrinAmt;
						 } else {
							 if(Integer.valueOf(speLsPdList[0]).intValue() == i
									 || Integer.valueOf(speLsPdList[1]).intValue() == i){
								 rntAmtDeal = 0;
								 remPrinAmt = afterFirstRemPrinAmt;
							 }else{
								 //利息
								 intAmt = DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)), 0);
								 //本金
								 prinAmt = DecimalUtils.sub(rntAmtDeal, intAmt);
								 //剩余本金= 上一期的剩余本金-本金
								 remPrinAmt = DecimalUtils.sub(afterFirstRemPrinAmt, prinAmt);
								 afterFirstRemPrinAmt = remPrinAmt;
							 }
						 }
						 totalRntAmt = DecimalUtils.add(totalRntAmt, rntAmtDeal);
						 totalPrinAmt = DecimalUtils.add(totalPrinAmt, prinAmt);
						 totalIntAmt = DecimalUtils.add(totalIntAmt, intAmt);
						 totalRemPrinAmt = DecimalUtils.add(totalRemPrinAmt, remPrinAmt);
						 pay.setIntAmt(intAmt);
						 pay.setRemPrinAmt(remPrinAmt);
						 pay.setRntAmt(rntAmtDeal);
						 pay.setPrinAmt(prinAmt);
						 pay.setIsModify(BaseConstant.IS_YESNO_NO);
						 prjQuatPrpsPaySchList.add(pay);
						 tmpPay.setRntAmt(rntAmtDeal);
						 tempPayList.add(tmpPay);
					 }
				 }
				 if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.PAY_WAY_CD_20)){
					 for (int i = 1; i <= lsPd; i++) {
						 PrjQuatPrpsPaySchVO pay = new PrjQuatPrpsPaySchVO();
						 PrjQuatPrpsPaySchVO tmpPay = new PrjQuatPrpsPaySchVO();
						 tmpPay.setPayPd(Long.valueOf(i));
						 pay.setPayPd(Long.valueOf(i));
						 double prinAmt = 0d;//本金
						 double intAmt = 0d;//利息
						 double remPrinAmt = 0d;//剩余本金
						 double rntAmtDeal = DecimalUtils.div(rntAmt*lsPd-60000,lsPd-2,0);
						 prjQuatPrps.setEachEstRntAmt(rntAmtDeal);
						 if (i == 1) {
							 rntAmtDeal = 30000;
							 intAmt = 0;
							 prinAmt = 30000;
							 remPrinAmt = DecimalUtils.sub(finacAmt, prinAmt);
							 afterFirstRemPrinAmt = remPrinAmt;
						 }else if(i == 2){
							 rntAmtDeal = 30000;
							 intAmt = 0;
							 prinAmt = 30000;
							 remPrinAmt = DecimalUtils.sub(afterFirstRemPrinAmt, prinAmt);
							 afterFirstRemPrinAmt = remPrinAmt;
						 } else if (i == lsPd) {
							 if (rntAmtDeal < afterFirstRemPrinAmt) {
								 rntAmtDeal = afterFirstRemPrinAmt;
							 }
							 prinAmt = afterFirstRemPrinAmt;
							 if (prjQuatPrps.getAnnIntRatePct().doubleValue() != 0d) {
								 intAmt = DecimalUtils.sub(rntAmtDeal, prinAmt);
							 } else {
								 intAmt = 0;
							 }
							 //最后一期剩余本金=0
							 remPrinAmt = 0;
							 afterFirstRemPrinAmt = remPrinAmt;
						 } else {
							 //利息
							 intAmt = DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)), 0);
							 //本金
							 prinAmt = DecimalUtils.sub(rntAmtDeal, intAmt);
							 //剩余本金= 上一期的剩余本金-本金
							 remPrinAmt = DecimalUtils.sub(afterFirstRemPrinAmt, prinAmt);
							 if(remPrinAmt<0){
								 prinAmt += remPrinAmt;
								 intAmt -= remPrinAmt;
								 remPrinAmt = 0;
							 }
							 afterFirstRemPrinAmt = remPrinAmt;
						 }
						 totalRntAmt = DecimalUtils.add(totalRntAmt, rntAmtDeal);
						 totalPrinAmt = DecimalUtils.add(totalPrinAmt, prinAmt);
						 totalIntAmt = DecimalUtils.add(totalIntAmt, intAmt);
						 totalRemPrinAmt = DecimalUtils.add(totalRemPrinAmt, remPrinAmt);
						 pay.setIntAmt(intAmt);
						 pay.setRemPrinAmt(remPrinAmt);
						 pay.setRntAmt(rntAmtDeal);
						 pay.setPrinAmt(prinAmt);
						 pay.setIsModify(BaseConstant.IS_YESNO_NO);
						 prjQuatPrpsPaySchList.add(pay);
						 tmpPay.setRntAmt(rntAmtDeal);
						 tempPayList.add(tmpPay);
					 }
				 }
				 if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.PAY_WAY_CD_21)){
					 for (int i = 1; i <= lsPd; i++) {
						 PrjQuatPrpsPaySchVO pay = new PrjQuatPrpsPaySchVO();
						 PrjQuatPrpsPaySchVO tmpPay = new PrjQuatPrpsPaySchVO();
						 tmpPay.setPayPd(Long.valueOf(i));
						 pay.setPayPd(Long.valueOf(i));
						 double prinAmt = 0d;//本金
						 double intAmt = 0d;//利息
						 double remPrinAmt = 0d;//剩余本金
						 int spPpdSum = lsPd/3;
						 double rntAmtDeal = Math.floor(DecimalUtils.div(DecimalUtils.round(ProjectUtils.getPMT(DecimalUtils.div(MonthRate, 100)*3, spPpdSum, finacAmt, 0, 0), 0) - 60000,100))*100;
						 prjQuatPrps.setEachEstRntAmt(rntAmtDeal);
						 if (i == 1) {
							 rntAmtDeal = 30000;
							 intAmt = 0;
							 prinAmt = 30000;
							 remPrinAmt = DecimalUtils.sub(finacAmt, prinAmt);
							 afterFirstRemPrinAmt = remPrinAmt;
						 }else if(i%3 != 0){
							 rntAmtDeal = 30000;
							 intAmt = 0;
							 prinAmt = 30000;
							 remPrinAmt = DecimalUtils.sub(afterFirstRemPrinAmt, prinAmt);
							 if(remPrinAmt<0){
								 prinAmt += remPrinAmt;
								 intAmt -= remPrinAmt;
								 remPrinAmt = 0;
							 }
							 afterFirstRemPrinAmt = remPrinAmt;
						 } else if (i == lsPd) {
							 if (rntAmtDeal < afterFirstRemPrinAmt) {
								 rntAmtDeal = afterFirstRemPrinAmt;
							 }
							 prinAmt = afterFirstRemPrinAmt;
							 if (prjQuatPrps.getAnnIntRatePct().doubleValue() != 0d) {
								 intAmt = DecimalUtils.sub(rntAmtDeal, prinAmt);
							 } else {
								 intAmt = 0;
							 }
							 //最后一期剩余本金=0
							 remPrinAmt = 0;
							 afterFirstRemPrinAmt = remPrinAmt;
						 } else {
							 //利息
							 intAmt = DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)*3), 0);
							 //本金
							 prinAmt = DecimalUtils.sub(rntAmtDeal, intAmt);
							 //剩余本金= 上一期的剩余本金-本金
							 remPrinAmt = DecimalUtils.sub(afterFirstRemPrinAmt, prinAmt);
							 if(remPrinAmt<0){
								 prinAmt += remPrinAmt;
								 intAmt -= remPrinAmt;
								 remPrinAmt = 0;
							 }
							 afterFirstRemPrinAmt = remPrinAmt;
						 }
						 totalRntAmt = DecimalUtils.add(totalRntAmt, rntAmtDeal);
						 totalPrinAmt = DecimalUtils.add(totalPrinAmt, prinAmt);
						 totalIntAmt = DecimalUtils.add(totalIntAmt, intAmt);
						 totalRemPrinAmt = DecimalUtils.add(totalRemPrinAmt, remPrinAmt);
						 pay.setIntAmt(intAmt);
						 pay.setRemPrinAmt(remPrinAmt);
						 pay.setRntAmt(rntAmtDeal);
						 pay.setPrinAmt(prinAmt);
						 pay.setIsModify(BaseConstant.IS_YESNO_NO);
						 prjQuatPrpsPaySchList.add(pay);
						 tmpPay.setRntAmt(rntAmtDeal);
						 tempPayList.add(tmpPay);
					 }
				 }
			 }

	       }

		 prjQuatPrps.setTotalRntAmt(totalRntAmt);
		 prjQuatPrps.setTotalPrinAmt(totalPrinAmt);
		 prjQuatPrps.setTotalIntAmt(totalIntAmt);
		 prjQuatPrps.setTotalRemPrinAmt(totalRemPrinAmt);
		 prjQuatPrps.setFirstPayAmt(firstPayAmt);

		 sortPrjPayList(prjQuatPrps.getPrjQuatPrpsPaySchList());

		 sortPrjPayList(tempPayList);
		 if((prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_BEGI_EQUAL__PRINC_INTER)||prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_END_EQUAL__PRINC_INTER)
				 || prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_END_NO_EQUAL)||prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_BEGI_NO_EQUAL)
				 )&&prjQuatPrps.getAnnIntRatePct().doubleValue()!=0d){
			 //期初、期末等额本息，将差值配平到最后一期的利息上、利率不等于0利率
			 this.balancingDiffer(prjQuatPrpsPaySchList,prjQuatPrps);
		 }
		 prjQuatPrps.setPrjQuatPrpsPaySchList(prjQuatPrpsPaySchList);

		 //计算IRR
		 double irrRate = 0d;
		 double[]  cashFlows =new double[prjQuatPrps.getLsPd().intValue()+1];
		 List<SysDictionaryDTO>  dicList =  this.sysDictionaryApiService.searchGroup(CurrentThreadContext.getCurrentSysCd(), prjBsc.getCstMgrOrgCd(),DictionaryConstant.CODE_QUAT_IRR_FEE_CD );
		 List<SysDictionaryDTO>  subDicList =  this.sysDictionaryApiService.searchGroup(prjQuatPrps.getSysCd(), prjQuatPrps.getOrgCd(),DictionaryConstant.CODE_IRR_SUB_CD );
		 double addAmt = 0d;
		 double subAmt = 0d;
		 double subFromLastAmt =0d;//从最后一期向上减的费用项
		 if(CollectionUtils.isNotEmpty(dicList)){
			 for (SysDictionaryDTO sysDictionaryDTO : dicList) {
				 for (PrjQuatPrpsFeeVO feeVO : prjQuatPrps.getPrjQuatPrpsFeelist()) {
					if(sysDictionaryDTO.getCode().equals(feeVO.getFeeTypCd())){
						if(sysDictionaryDTO.getCodeAttr1().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CASH_FLOW_IN)){
							addAmt = DecimalUtils.add(addAmt, feeVO.getFeeAmt());
						}
						if(sysDictionaryDTO.getCodeAttr1().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CASH_FLOW_OUT)){
							subAmt = DecimalUtils.add(subAmt, feeVO.getFeeAmt());
						}
					/*	if(StringUtils.isNotBlank(sysDictionaryDTO.getCodeAttr2())&&sysDictionaryDTO.getCodeAttr2().equals(BaseConstant.IS_YESNO_YES+"")){
							subFromLastAmt = DecimalUtils.add(subFromLastAmt, feeVO.getFeeAmt());
						}*/
					}
				}
			}
		 }
	  	 if(CollectionUtils.isNotEmpty(subDicList)){
			 for (SysDictionaryDTO sysDictionaryDTO : subDicList) {
				 for (PrjQuatPrpsFeeVO feeVO : prjQuatPrps.getPrjQuatPrpsFeelist()) {
					 if(sysDictionaryDTO.getCode().equals(feeVO.getFeeTypCd())){
								 if(sysDictionaryDTO.getCodeAttr1().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CASH_FLOW_IN)){
									 subFromLastAmt = DecimalUtils.add(subFromLastAmt, feeVO.getFeeAmt());
								 }
								 if(sysDictionaryDTO.getCodeAttr1().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CASH_FLOW_OUT)){
									 subFromLastAmt = DecimalUtils.sub(subFromLastAmt, feeVO.getFeeAmt());
								 }
					 }

				}
			 }
	  	 }
		 //查询融资额中添加的费用项
		 //查询要减去的费用项
		 cashFlows[0]=(DecimalUtils.sub(DecimalUtils.add(-prjQuatPrps.getActLsAmt(), addAmt),subAmt));
		 List<PrjQuatPrpsPaySchVO> payPrpsList = new ArrayList<PrjQuatPrpsPaySchVO>();
		 for (int i=tempPayList.size()-1;i>=0;i--) {
			 PrjQuatPrpsPaySchVO pay  = tempPayList.get(i);
			 PrjQuatPrpsPaySchVO irrPay = new PrjQuatPrpsPaySchVO();
			 irrPay.setPayPd(pay.getPayPd());
			 if(subFromLastAmt>=pay.getRntAmt()){
				// if(tmpAmt>=pay.getRntAmt()){
					 irrPay.setRntAmt(0d);
				// }
				// if(tmpAmt<pay.getRntAmt()){

				// }
			 }else if(subFromLastAmt<pay.getRntAmt()&&subFromLastAmt>0){
				 irrPay.setRntAmt(DecimalUtils.sub(pay.getRntAmt(), subFromLastAmt));
			 }else{
				 irrPay.setRntAmt(pay.getRntAmt());
			 }
			  subFromLastAmt = DecimalUtils.sub(subFromLastAmt, pay.getRntAmt());
			 payPrpsList.add(irrPay);
		}
		 this.sortPrjPayList(payPrpsList);
		 // 已拆分的渠道担保费
		 double subedDpstAmt = 0d ;
		 for (int i=0;i<payPrpsList.size();i++) {
			 if(chlDpstAmt>0 && payPrpsList.get(i).getPayPd() >= prjQuatPrps.getRtnPdStart() && payPrpsList.get(i).getPayPd() <= prjQuatPrps.getRtnPdEnd()){
				 if (payPrpsList.get(i).getPayPd().intValue() == prjQuatPrps.getRtnPdEnd().intValue()){
					 payPrpsList.get(i).setRntAmt(DecimalUtils.sub(payPrpsList.get(i).getRntAmt(),(chlDpstAmt - subedDpstAmt)));
				 }else{
					 double avgDpstAmt = DecimalUtils.div(chlDpstAmt ,(prjQuatPrps.getRtnPdEnd() - prjQuatPrps.getRtnPdStart() + 1),0);
					 payPrpsList.get(i).setRntAmt(DecimalUtils.sub(payPrpsList.get(i).getRntAmt(), avgDpstAmt));
					 subedDpstAmt += avgDpstAmt ;
				 }
			 }
			 cashFlows[i+1] = payPrpsList.get(i).getRntAmt();
		  }
		 irrRate = DecimalUtils.round(ProjectUtils.getIRR(cashFlows, Double.NaN)*12*100, 2);
		 prjQuatPrps.setIrrPct(irrRate);
		 this.judgeLowRateBusinessIrr(prjQuatPrps);
		 prjQuatPrps.setTempPayList(tempPayList);
         this.getCstIrrRate(prjQuatPrps);
		 //重卡厂商业务计算irr2
			 if((prjBsc.getPrjTypCd().equals(PrjBscInfoConstant.PRJ_TYP_CD_CPYW) && (prjBsc.getIsSplMfr() == 1L)) || (prjBsc.getPrjTypCd().equals(PrjBscInfoConstant.PRJ_TYP_CD_CTYW) && (prjBsc.getIsSplMfr() == 1L))){
			 double irrRate2 = getMfrIrrRate2(prjQuatPrps);
			 prjQuatPrps.setIrrPct2(irrRate2);
		 }
		}
		/* prjQuatPrps.setTotalRntAmt(totalRntAmt);
		 prjQuatPrps.setTotalPrinAmt(totalPrinAmt);
		 prjQuatPrps.setTotalIntAmt(totalIntAmt);
		 prjQuatPrps.setTotalRemPrinAmt(totalRemPrinAmt);*/
		 //如果是期初/期末等额本息,配平最后的差值
		 //将分转化为元
	    }
		 prjQuatPrps = this.convertPrjQuatPrpsFenToYuan(prjQuatPrps);
		 return prjQuatPrps;
	}

	/**
	 * @Description: 判断低息业务实际收益率IRR
	 * @author shenhao
	 * @date 2020/6/17 12:23
	 */
	public void judgeLowRateBusinessIrr(PrjQuatPrpsVO prjQuatPrps) throws BaseException {
		double irrRate = prjQuatPrps.getIrrPct();
		logger.info("judgeLowRateBusinessIrr.IRR.prjId:{},irrRate:{}",prjQuatPrps.getPrjId(),irrRate);
		//客户保证金
		double colLateral = 0d;
		PrjBscInfoVO bscInfoDTO = this.prjBscInfoService.selectById(prjQuatPrps.getPrjId());
		if(PrjBscInfoConstant.CODE_BU_ORG_CD_ZK.equals(bscInfoDTO.getBuOrgCd())){
			List<PrjQuatPrpsFeeVO>  feeList = prjQuatPrps.getPrjQuatPrpsFeelist();
			if(CollectionUtils.isNotEmpty(feeList)){
				for (PrjQuatPrpsFeeVO prjQuatPrpsFeeDTO : feeList) {
					if (prjQuatPrpsFeeDTO.getFeeTypCd().equals(PrjQuatPrpsFeeConstant.PRJ_FEE_TYP_COLLATERAL)){
						colLateral = prjQuatPrpsFeeDTO.getFeePct();
					}
				}
			}
			if(PrjQuatPrpsConstant.SPECIAL_BUSINESS_TYPE_3.equals(prjQuatPrps.getSpecialBusinessType())){
				if(new BigDecimal(colLateral).compareTo(new BigDecimal(30)) < 0){
					throw new BaseException(BaseExceptionConstant.BASE_EXCEPTION_CODE_600, "低息业务客户保证金必须大于等于30%！");
				}
			}else{
				//传统城配 非低息业务 判断irr和客户保证金比例判断是否弹窗提示用户修改报价方案
				if(bscInfoDTO.getPrjTypCd().equals(PrjBscInfoConstant.PRJ_TYP_CD_CPYW) || bscInfoDTO.getPrjTypCd().equals(PrjBscInfoConstant.PRJ_TYP_CD_CTYW)){
					if("0".equals(prjQuatPrps.getIsNeedOpenWin()) && colLateral >= 30){
						throw new BaseException("000000", "该项目支持保证金抵租金流程，是否使用？（特殊业务类型需包含低息业务）");
					}
				}
				if(PrjQuatPrpsConstant.SPECIAL_BUSINESS_TYPE_2.equals(prjQuatPrps.getSpecialBusinessType())){
					if(new BigDecimal(irrRate).compareTo(new BigDecimal(13)) >= 0 || new BigDecimal(irrRate).compareTo(new BigDecimal(10.5)) < 0){
						throw new BaseException(BaseExceptionConstant.BASE_EXCEPTION_CODE_600, "打点业务实际收益率必须满足10.5%≤IRR＜13%！");
					}
				}
				if(PrjQuatPrpsConstant.SPECIAL_BUSINESS_TYPE_1.equals(prjQuatPrps.getSpecialBusinessType())){
					if(new BigDecimal(irrRate).compareTo(new BigDecimal(12)) >= 0 || new BigDecimal(irrRate).compareTo(new BigDecimal(8)) < 0){
						throw new BaseException(BaseExceptionConstant.BASE_EXCEPTION_CODE_600, "担保业务实际收益率必须满足8%≤IRR＜12%！");
					}
				}
				if(PrjQuatPrpsConstant.SPECIAL_BUSINESS_TYPE_4.equals(prjQuatPrps.getSpecialBusinessType())){
					if(new BigDecimal(irrRate).compareTo(new BigDecimal(13)) >= 0 || new BigDecimal(irrRate).compareTo(new BigDecimal(9)) < 0){
						throw new BaseException(BaseExceptionConstant.BASE_EXCEPTION_CODE_600, "轻卡政策业务实际收益率必须满足9%≤IRR＜13%！");
					}
				}
				if(PrjQuatPrpsConstant.SPECIAL_BUSINESS_TYPE_5.equals(prjQuatPrps.getSpecialBusinessType())){
					if(new BigDecimal(irrRate).compareTo(new BigDecimal(13)) >= 0 || new BigDecimal(irrRate).compareTo(new BigDecimal(9)) < 0){
						throw new BaseException(BaseExceptionConstant.BASE_EXCEPTION_CODE_600, "中载政策业务实际收益率必须满足9%≤IRR＜13%！");
					}
				}
			}
		}
	}

    public double getCstIrrRate(PrjQuatPrpsVO prjQuatPrps) throws BaseException{
        //计算IRR
        double irrRate = 0d;
        double[]  cashFlows =new double[prjQuatPrps.getLsPd().intValue()+1];
        List<SysDictionaryDTO>  dicList =  this.sysDictionaryApiService.searchGroup(prjQuatPrps.getSysCd(), prjQuatPrps.getOrgCd(),"PRJ0666" );
        List<SysDictionaryDTO>  subDicList =  this.sysDictionaryApiService.searchGroup(prjQuatPrps.getSysCd(), prjQuatPrps.getOrgCd(),"PRJ0667");
        double addAmt = 0d;
        double backAmt = 0d;
		double subFromLastAmt = 0d;
        Map<Long,Double> lastAmtMap = new HashMap<Long,Double>();
        for (PrjQuatPrpsFeeVO feeVO : prjQuatPrps.getPrjQuatPrpsFeelist()) {
            String feeTypCd = feeVO.getFeeTypCd();
            if(PrjQuatPrpsFeeConstant.FEE_TYP_CD_08.equals(feeTypCd) || PrjQuatPrpsFeeConstant.FEE_TYP_CD_49.equals(feeTypCd)){
                backAmt += feeVO.getFeeAmt();
            }
        }

        //查询融资额中添加的费用项
        if(CollectionUtils.isNotEmpty(dicList)){
            for (SysDictionaryDTO sysDictionaryDTO : dicList) {
                for (PrjQuatPrpsFeeVO feeVO : prjQuatPrps.getPrjQuatPrpsFeelist()) {
                    if(sysDictionaryDTO.getCode().equals(feeVO.getFeeTypCd())){
                        addAmt = DecimalUtils.add(addAmt, feeVO.getFeeAmt());
                    }
                }
            }
        }
        //查询要减去的费用项
        if(CollectionUtils.isNotEmpty(subDicList)){
            for (SysDictionaryDTO sysDictionaryDTO : subDicList) {
                for (PrjQuatPrpsFeeVO feeVO : prjQuatPrps.getPrjQuatPrpsFeelist()) {
                    if(sysDictionaryDTO.getCode().equals(feeVO.getFeeTypCd()) && StringUtils.isNotBlank(sysDictionaryDTO.getCodeAttr1())){
                        Long pd = Long.valueOf(sysDictionaryDTO.getCodeAttr1());
                        if(!(pd.compareTo(Long.valueOf(prjQuatPrps.getTempPayList().size()))<0)){
                            pd = -1L;
                        }
						if(pd.equals(DictionaryConstant.CODE_QUAT_IRR_LAST_PD_LOW)){
							subFromLastAmt = feeVO.getFeeAmt();
						}
                        if(lastAmtMap.containsKey(pd)){
                            lastAmtMap.put(pd,lastAmtMap.get(pd) + feeVO.getFeeAmt());
                        }else{
                            lastAmtMap.put(pd,feeVO.getFeeAmt());
                        }
                    }
                }
            }
        }
		logger.info("getCstIrrRate.对客IRR.prjId:{},addAmt:{}",prjQuatPrps.getPrjId(),addAmt);
        cashFlows[0]=(DecimalUtils.add(-prjQuatPrps.getActLsAmt(), addAmt));
        List<PrjQuatPrpsPaySchVO> payPrpsList = new ArrayList<PrjQuatPrpsPaySchVO>();
        for (int i=prjQuatPrps.getTempPayList().size()-1;i>=0;i--) {
            PrjQuatPrpsPaySchVO pay  = prjQuatPrps.getTempPayList().get(i);
            PrjQuatPrpsPaySchVO irrPay = new PrjQuatPrpsPaySchVO();
            Long payPd = pay.getPayPd();
            irrPay.setPayPd(payPd);
            if(MapUtils.isNotEmpty(lastAmtMap)){
                if(lastAmtMap.containsKey(payPd)){
                    irrPay.setRntAmt(DecimalUtils.sub(pay.getRntAmt(), lastAmtMap.get(payPd)));
                }else if(payPd == prjQuatPrps.getTempPayList().size() && lastAmtMap.containsKey(-1L)){
                    irrPay.setRntAmt(DecimalUtils.sub(pay.getRntAmt(), lastAmtMap.get(-1L)));
                }else{
                    irrPay.setRntAmt(pay.getRntAmt());
                }
				double rntAmt = irrPay.getRntAmt();
				if(rntAmt>0){
					if (subFromLastAmt >= rntAmt) {
						irrPay.setRntAmt(0d);
					} else if (subFromLastAmt < rntAmt && subFromLastAmt > 0) {
						irrPay.setRntAmt(DecimalUtils.sub(rntAmt, subFromLastAmt));
					}
					subFromLastAmt = DecimalUtils.sub(subFromLastAmt, rntAmt);
				}
            }else{
                irrPay.setRntAmt(pay.getRntAmt());
            }
            payPrpsList.add(irrPay);
        }
        this.sortPrjPayList(payPrpsList);

		/**
		 * 获取重卡事业部二手车车长，小于4200者，供应商返利比例可放宽至8%
		 */
		Double backCheck = null ;
		PrjBscInfoVO prjBscInfoVO = prjBscInfoService.selectById(prjQuatPrps.getPrjId());
		if(PrjBscInfoConstant.CODE_BU_ORG_CD_ZK.equals(prjBscInfoVO.getBuOrgCd()) &&
				(PrjBscInfoConstant.PRJ_TYP_CD_ESCJYD.equals(prjBscInfoVO.getPrjTypCd())
						|| PrjBscInfoConstant.PRJ_TYP_CD_OWNJYD.equals(prjBscInfoVO.getPrjTypCd()))){
			// 查询项目产品扩展信息
			PrjPrdBscInfoQueryCondition condition = new PrjPrdBscInfoQueryCondition();
			condition.setPrjId(prjQuatPrps.getPrjId());
			condition.setIsDel(BaseConstant.IS_YESNO_NO);
			List<PrjPrdBscInfoVO> prjPrdBscInfoVOS = prjPrdBscInfoService.searchList(condition);
			logger.info("校验供应商返利比例，获取产品信息:prjId:{}",prjQuatPrps.getPrjId());
			for (PrjPrdBscInfoVO dto:prjPrdBscInfoVOS){
				PrjPrdExtDTO prjPrdExtDTO = prjPrdExtApiService.selectById(dto.getId());
				logger.info("项目产品扩展信息：prjId:{},prjPrdExtDTO:{}",prjQuatPrps.getPrjId(), JSON.toJSONString(prjPrdExtDTO));
				String cntrSz = prjPrdExtDTO.getCntrSz();
				if (StringUtils.isNotEmpty(cntrSz)){
					String[] cntrSzs = cntrSz.trim().split("\\*");
					if(cntrSzs.length != 3 || !(cntrSzs[0].matches("^\\d+(\\.\\d+)?$") && cntrSzs[1].matches("^\\d+(\\.\\d+)?$") && cntrSzs[2].matches("^\\d+(\\.\\d+)?$")) || Double.valueOf(cntrSzs[0]) > 4200){
						backCheck = null ;
						break;
					}else if(Double.valueOf(cntrSzs[0]) <= 4200){
						backCheck = 0.08d ;
					}
				}else{
					backCheck = null ;
					break;
				}
			}
		}
        for (int i=0;i<payPrpsList.size();i++) {
            cashFlows[i+1] = payPrpsList.get(i).getRntAmt();
        }
        irrRate = DecimalUtils.round(ProjectUtils.getIRR(cashFlows, Double.NaN)*12*100, 2);
		logger.info("getCstIrrRate.对客IRR.prjId:{},irrRate:{}",prjQuatPrps.getPrjId(),irrRate);
        int times = ProjectUtils.getTypeNum(Integer.parseInt(prjQuatPrps.getLsPdUntCd()));
        irrRate = irrRate/times;
		/**
         * 针对不同事业部 业务类型 校验irr大小
         */
        String prjTypCd = prjBscInfoVO.getPrjTypCd();
        double backPct = DecimalUtils.div(backAmt,prjQuatPrps.getActLsAmt(),8);
        List<SysDictionaryDTO>  irrCtrList =  this.sysDictionaryApiService.searchGroup(prjQuatPrps.getSysCd(), prjQuatPrps.getOrgCd(),DictionaryConstant.CODE_QUAT_IRR_668);
        if(CollectionUtils.isNotEmpty(irrCtrList)){
            for (SysDictionaryDTO sysDictionaryDTO : irrCtrList) {
                if(StringUtils.isNotBlank(prjTypCd)&& prjTypCd.equals(sysDictionaryDTO.getCode())){
                    double irrCheck = Double.valueOf(sysDictionaryDTO.getCodeAttr1());
                    if (backCheck == null || Double.valueOf(sysDictionaryDTO.getCodeAttr2())>backCheck){
						backCheck = Double.valueOf(sysDictionaryDTO.getCodeAttr2());
					}
                    if(irrRate>irrCheck){
                        throw new BaseException("对客IRR(" + irrRate + "%)不能高于" + irrCheck + "%！请降价");
                    }
                    if(backCheck != null && backPct>backCheck){
                        throw new BaseException("（供应商返利+销售返利）/实际融资额（" + backPct*100 + "%）不能高于" + backCheck*100 + "%");
                    }
                }
            }
        }
        prjQuatPrps.setCstIrr(irrRate);
        return irrRate;
    }

	//浙商方案
	private PrjQuatPrpsVO prjQuatPrpsCalculateForZG(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO =PrjQuatPrpsVOTransform.toVO(this.prjQuatPrpsApiService.prjQuatPrpsCalculateForZG(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
		return prpsVO;
	}
	//浙银金租
	private PrjQuatPrpsVO prjQuatPrpsCalculateForZGZYFL(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO =PrjQuatPrpsVOTransform.toVO(this.prjQuatPrpsApiService.prjQuatPrpsCalculateForZGZYFL(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
		return prpsVO;
	}
	//传统资管报价 PMT
	private PrjQuatPrpsVO caclZGTraditionPMT(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO =PrjQuatPrpsVOTransform.toVO(this.prjQuatPrpsApiService.caclZGTraditionPMT(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
		return prpsVO;
	}

	/**
	 * 三方资管 --江西银行报价
	 * @param prjQuatPrps
	 * @return
	 */
	private PrjQuatPrpsVO prjQuatPrpsCalculateForZGJXBANK(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO =PrjQuatPrpsVOTransform.toVO(this.prjQuatPrpsApiService.prjQuatPrpsCalculateForZGJXBANK(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
		return prpsVO;
	}
	//苏宁方案
	private PrjQuatPrpsVO prjQuatPrpsCalculateForZGSN(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO =PrjQuatPrpsVOTransform.toVO(this.prjQuatPrpsApiService.prjQuatPrpsCalculateForZGSN(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
		return prpsVO;
	}
	//浦发方案
	private PrjQuatPrpsVO prjQuatPrpsCalculateForZGPF(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO =PrjQuatPrpsVOTransform.toVO(this.prjQuatPrpsApiService.prjQuatPrpsCalculateForZGPF(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
		return prpsVO;
	}
	//新的工行和上装方案
	private PrjQuatPrpsVO prjQuatPrpsCalculateForZKGHNew(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO =PrjQuatPrpsVOTransform.toVO(this.prjQuatPrpsApiService.prjQuatPrpsCalculateForZKGHNew(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
		return prpsVO;
	}


	private PrjQuatPrpsVO prjQuatPrpsCalculateForYCLadder(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO =PrjQuatPrpsVOTransform.toVO(this.prjQuatPrpsApiService.prjQuatPrpsCalculateForYCLadder(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
		return prpsVO;
	}


	/*private PrjQuatPrpsVO prjQuatPrpsCalculateForZKCSYW(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO =PrjQuatPrpsVOTransform.toVO(this.prjQuatPrpsApiService.prjQuatPrpsCalculateForZKCSYW(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
		return prpsVO;
	}*/


	private PrjQuatPrpsVO prjQuatPrpsCalculateForZKGH(PrjQuatPrpsVO prjQuatPrps) {
		 List<PrjQuatPrpsPaySchVO> prjQuatPrpsPaySchList = new ArrayList<PrjQuatPrpsPaySchVO>();
		 List<PrjQuatPrpsPaySchVO> prjPayList = new ArrayList<PrjQuatPrpsPaySchVO>();
			 double  totalRntAmt = 0d;//合计租金
			 double  totalPrinAmt = 0d;//合计本金
			 double  totalIntAmt = 0d;//合计利息
			 double totalRemPrinAmt = 0d;//合计剩余本金
			 double firstPayAmt = 0d;//首付款
			 double irrRate = 0d;
			List<PrjQuatPrpsPaySchVO> payList = prjQuatPrps.getPrjQuatPrpsPaySchList();
		 int lsPd =0;//租期
		 double MonthRate = 0d;//月利率
		 if(null!=prjQuatPrps){
			 if(null==prjQuatPrps.getLsPd()||prjQuatPrps.getLsPd().intValue()==0){
					throw new BaseException(BaseExceptionConstant.BASE_EXCEPTION_CODE_600,"租期不能为空！");
			 }
			 int feeScale = 0; //费用小数位
			 int annIntScale = 0; //年利率小数位
			 int floatScale = 0; //上浮小数位数
			//根据事业部获取小数位数
			Map<String,String> decDigitsMap =  this.getDecimalDigitsByBuOrgCode();
			 if(!decDigitsMap.isEmpty()){
				 annIntScale = Integer.valueOf(decDigitsMap.get(PrjQuatPrpsConstant.CODE_ANNINT_RATE_NUM_CD));
				 floatScale = Integer.valueOf(decDigitsMap.get(PrjQuatPrpsConstant.CODE_FLOAT_RATE_NUM_CD));
				 feeScale =  Integer.valueOf(decDigitsMap.get(PrjQuatPrpsConstant.CODE_FEE_DECI_NUM_CD));
			 }else{
				 //没有查询到默认按10小数计算
				 feeScale = PrjQuatPrpsConstant.CODE_FEE_DECI_DEF_NUM; //费用小数位
				 annIntScale = PrjQuatPrpsConstant.CODE_ANNINT_RATE_DEF_NUM; //年利率小数位
				 floatScale = PrjQuatPrpsConstant.CODE_FLOAT_RATE_DEF_NUM; //上浮小数位数
			 }

			lsPd = prjQuatPrps.getLsPd().intValue();
			//月利率= 年利率/12
		//	MonthRate = DecimalUtils.div(DecimalUtils.round(prjQuatPrps.getAnnIntRatePct(), annIntScale),12);
			double dowePay = 0d;//首期租金
			double finacAmt = 0d;//融资额
			double tempFinalAmt = 0d;
			//方案费用明细
		if(CollectionUtils.isNotEmpty(prjQuatPrps.getPrjQuatPrpsFeelist())){
			//首期租金
			double firstRntAmt = 0d;
			for (PrjQuatPrpsFeeVO firstDetail : prjQuatPrps.getPrjQuatPrpsFeelist()) {
				if(firstDetail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_DOWNPAY)){
					firstRntAmt = ProjectUtils.getFirstAmt(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),firstDetail.getCalBaseCd(),firstDetail.getFeePct());
				}
			}
			for (int i=0; i<prjQuatPrps.getPrjQuatPrpsFeelist().size();i++) {
				PrjQuatPrpsFeeVO detail  = prjQuatPrps.getPrjQuatPrpsFeelist().get(i);
				if(detail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_DOWNPAY)){
					dowePay =DecimalUtils.round(ProjectUtils.getFirstAmt(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),detail.getCalBaseCd(), DecimalUtils.round(detail.getFeePct(),feeScale)), 0);
					firstPayAmt=DecimalUtils.add(dowePay, firstPayAmt);
					continue;
				}
				//除去留购价和首期租金的其他费用
				if(!detail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_DOWNPAY)){
				if(detail.getCntWayCd().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CNT_WAY_DOWNPAY)){
					//计入首期款的费用项
					if(detail.getIsFixedAmt().equals(BaseConstant.IS_YESNO_NO)){
						//按比计算
						double amt = 0d;
							amt = DecimalUtils.round(ProjectUtils.getAmtByCalBase(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),firstRntAmt,detail.getCalBaseCd(),DecimalUtils.round(detail.getFeePct(),feeScale)),0);
						detail.setFeeAmt(amt);
						firstPayAmt=DecimalUtils.add(amt, firstPayAmt);
					}else{
						//固定值
						firstPayAmt=DecimalUtils.add(detail.getFeeAmt(), firstPayAmt);
					}
					continue;
				}
				if(detail.getCntWayCd().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CNT_WAY_FINANC)){
					//计入融资额的费用项
					if(null!=detail.getFeePct()){
						//按比计算
						double amt = 0d;
						//按比计 算
							 amt =   DecimalUtils.round(ProjectUtils.getAmtByCalBase(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),firstRntAmt,detail.getCalBaseCd(),DecimalUtils.round(detail.getFeePct(),feeScale)),0);
						detail.setFeeAmt(amt);
						finacAmt=DecimalUtils.add(amt, finacAmt);
					}else{
						//固定值
						finacAmt=DecimalUtils.add(detail.getFeeAmt(), finacAmt);
					}
				}
				}
			}

		}

		//融资额 = 合同额-首期租金
		finacAmt = DecimalUtils.add(finacAmt, DecimalUtils.sub(prjQuatPrps.getContAmt(), dowePay));//实际融资额
		tempFinalAmt = DecimalUtils.add(tempFinalAmt, DecimalUtils.sub(prjQuatPrps.getContAmt(), dowePay));//实际融资额

		prjQuatPrps.setActLsAmt(finacAmt);
		double afterFirstRemPrinAmt = 0d;//第一期后的剩余本金
		//工行利率
		double bankRate = 0d;
		bankRate = prjQuatPrps.getAnnIntRatePct();
		double rate = DecimalUtils.div(DecimalUtils.div(bankRate, 100), prjQuatPrps.getLsPd().doubleValue());
		//平均月租
		double averageMonthRnt =DecimalUtils.round(DecimalUtils.div(finacAmt, prjQuatPrps.getLsPd().doubleValue())+DecimalUtils.mul(finacAmt,rate), 0) ;
		//总费率
		double totalRate =DecimalUtils.div((DecimalUtils.mul(averageMonthRnt, prjQuatPrps.getLsPd().doubleValue())-tempFinalAmt), tempFinalAmt);
		double quatIntAmt = DecimalUtils.mul(finacAmt, rate);
		double tmp = Math.floor(DecimalUtils.div(quatIntAmt, 100));
		quatIntAmt = DecimalUtils.mul(tmp, 100);
		double firstIntAmt = DecimalUtils.mul(DecimalUtils.mul(finacAmt, rate), prjQuatPrps.getLsPd().doubleValue())-DecimalUtils.mul(quatIntAmt, (prjQuatPrps.getLsPd().intValue()-1));
		double quatPrinAmt = DecimalUtils.div(finacAmt, prjQuatPrps.getLsPd().doubleValue());
		double tmpPrinAmt = Math.floor(DecimalUtils.div(quatPrinAmt, 100));
		quatPrinAmt = DecimalUtils.mul(tmpPrinAmt, 100);
		double firstPrintAmt = finacAmt-DecimalUtils.mul(quatPrinAmt, (prjQuatPrps.getLsPd().intValue()-1));
		 double[]  cashFlows =new double[prjQuatPrps.getLsPd().intValue()+1];
		 cashFlows[0]=-tempFinalAmt;
		for(int i=1;i<=lsPd;i++){
			PrjQuatPrpsPaySchVO pay = new PrjQuatPrpsPaySchVO();
			PrjQuatPrpsPaySchVO tmpPay = new PrjQuatPrpsPaySchVO();
			tmpPay.setPayPd(Long.valueOf(i));
			pay.setPayPd(Long.valueOf(i));
			double  rntAmt = 0d;//租金
			double remPrinAmt = 0d;//剩余本金
			double intAmt = 0d;
			double prinAmt  = 0d;
				if(i==1){
					intAmt = firstIntAmt;
					//本金
					prinAmt = firstPrintAmt;
					//租金
					rntAmt = DecimalUtils.add(intAmt,prinAmt);
					//剩余本金
					remPrinAmt = DecimalUtils.sub(finacAmt, prinAmt);
					afterFirstRemPrinAmt = remPrinAmt;
				}else if(i==lsPd){
					intAmt = quatIntAmt;
					prinAmt = quatPrinAmt;
					//租金
					rntAmt = DecimalUtils.add(intAmt,prinAmt);
					remPrinAmt = 0;
					afterFirstRemPrinAmt = remPrinAmt;
				}else{

					intAmt = quatIntAmt;
					prinAmt = quatPrinAmt;
					//租金
					rntAmt = DecimalUtils.add(intAmt,prinAmt);
					//剩余本金= 上一期的剩余本金-本金
					remPrinAmt = DecimalUtils.sub(afterFirstRemPrinAmt, prinAmt);
					afterFirstRemPrinAmt = remPrinAmt;
					if(i==2){
						prjQuatPrps.setEachEstRntAmt(rntAmt);
					}
				}
				 cashFlows[i] = rntAmt;
			totalRntAmt = DecimalUtils.add(totalRntAmt, rntAmt);
			totalPrinAmt = DecimalUtils.add(totalPrinAmt, prinAmt);
			totalIntAmt = DecimalUtils.add(totalIntAmt, intAmt);
			totalRemPrinAmt = DecimalUtils.add(totalRemPrinAmt, remPrinAmt);
			pay.setIntAmt(intAmt);
			pay.setRemPrinAmt(remPrinAmt);
			pay.setRntAmt(rntAmt);
			pay.setPrinAmt(prinAmt);
			pay.setIsModify(BaseConstant.IS_YESNO_NO);
			prjQuatPrpsPaySchList.add(pay);
		}
		//计算工行的IRR
		List<SysDictionaryDTO>  subDicList =  this.sysDictionaryApiService.searchGroup(prjQuatPrps.getSysCd(), prjQuatPrps.getOrgCd(),DictionaryConstant.CODE_IRR_SUB_CD );
		double addAmt = 0d;
		double subAmt = 0d;
		double subFromLastAmt =0d;//从最后一期向上减的费用项
		double  splBackAmt =0d;
		for (PrjQuatPrpsFeeVO feeVO : prjQuatPrps.getPrjQuatPrpsFeelist()) {
			if(feeVO.getFeeTypCd().equals(PrjQuatPrpsFeeConstant.FEE_TYP_CD_08)){
				splBackAmt = feeVO.getFeeAmt();
			}
		}
		//先查询配置表里面的费用项，没有配置根据事业部查询数据字典的费用项
	/*	SysCdMapDQueryCondition qc = new SysCdMapDQueryCondition();
		qc.setmTypCd(ProductConstant.SYS_MAP_M_TYP_PRJ_CD);	//映射类型代码
		qc.setSysCd(CurrentThreadContext.getCurrentSysCd());	//系统代码
		qc.setOrgCd(CurrentThreadContext.getCurrentOrgCd());	//组织架构代码
		List<SysCdMapDDTO> searchSysCdMapDWithTargetList = this.sysCdMapApiService.searchSysCdMapDWithTargetList(qc);
		if(CollectionUtils.isNotEmpty(searchSysCdMapDWithTargetList)){
			for (SysCdMapDDTO sysCdMapD : searchSysCdMapDWithTargetList) {
				for (PrjQuatPrpsFeeVO feeVO : prjQuatPrps.getPrjQuatPrpsFeelist()) {
					if(sysCdMapD.getSCode().equals(feeVO.getFeeTypCd())){
						double amt = feeVO.getFeeAmt();
						if(feeVO.getFeeTypCd().equals(PrjQuatPrpsFeeConstant.PRJ_FEE_TYP_CONSULT_1)){
							amt = feeVO.getFeeAmt()-splBackAmt;
						}
						if(sysCdMapD.getCodeAttr1().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CASH_FLOW_IN)){
							addAmt = DecimalUtils.add(addAmt, amt);
						}
						if(sysCdMapD.getCodeAttr1().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CASH_FLOW_OUT)){
							subAmt = DecimalUtils.add(subAmt, amt);
						}

					}
				}
			}

		}else{*/
			List<SysDictionaryDTO>  dicList =  this.sysDictionaryApiService.searchGroup(CurrentThreadContext.getCurrentSysCd(), CurrentThreadContext.getCurrentOrgCd(),DictionaryConstant.CODE_QUAT_IRR_FEE_CD );
			if(CollectionUtils.isNotEmpty(dicList)){
				for (SysDictionaryDTO sysDictionaryDTO : dicList) {
					for (PrjQuatPrpsFeeVO feeVO : prjQuatPrps.getPrjQuatPrpsFeelist()) {
						if(sysDictionaryDTO.getCode().equals(feeVO.getFeeTypCd())){
							double amt = feeVO.getFeeAmt();
							if(feeVO.getFeeTypCd().equals(PrjQuatPrpsFeeConstant.PRJ_FEE_TYP_CONSULT_1)){
								amt = feeVO.getFeeAmt()-splBackAmt;
							}
							if(sysDictionaryDTO.getCodeAttr1().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CASH_FLOW_IN)){
								addAmt = DecimalUtils.add(addAmt, amt);
							}
							if(sysDictionaryDTO.getCodeAttr1().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CASH_FLOW_OUT)){
								subAmt = DecimalUtils.add(subAmt, amt);
							}
						}
					}
				}
			}
	//	}
	  	 if(CollectionUtils.isNotEmpty(subDicList)){
			 for (SysDictionaryDTO sysDictionaryDTO : subDicList) {
				 for (PrjQuatPrpsFeeVO feeVO : prjQuatPrps.getPrjQuatPrpsFeelist()) {
					 if(sysDictionaryDTO.getCode().equals(feeVO.getFeeTypCd())){
								 if(sysDictionaryDTO.getCodeAttr1().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CASH_FLOW_IN)){
									 subFromLastAmt = DecimalUtils.add(subFromLastAmt, feeVO.getFeeAmt());
								 }
								 if(sysDictionaryDTO.getCodeAttr1().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CASH_FLOW_OUT)){
									 subFromLastAmt = DecimalUtils.sub(subFromLastAmt, feeVO.getFeeAmt());
								 }
					 }

				}
			 }
	  	 }
		 //查询融资额中添加的费用项
		 //查询要减去的费用项
		 cashFlows[0]=(DecimalUtils.sub(DecimalUtils.add(-prjQuatPrps.getActLsAmt(), addAmt),subAmt));
		 List<PrjQuatPrpsPaySchVO> payPrpsList = new ArrayList<PrjQuatPrpsPaySchVO>();
		 for (int i=prjQuatPrpsPaySchList.size()-1;i>=0;i--) {
			 PrjQuatPrpsPaySchVO pay  = prjQuatPrpsPaySchList.get(i);
			 PrjQuatPrpsPaySchVO irrPay = new PrjQuatPrpsPaySchVO();
			 irrPay.setPayPd(pay.getPayPd());
			 if(subFromLastAmt>=pay.getRntAmt()){
				// if(tmpAmt>=pay.getRntAmt()){
					 irrPay.setRntAmt(0d);
				// }
				// if(tmpAmt<pay.getRntAmt()){

				// }
			 }else if(subFromLastAmt<pay.getRntAmt()&&subFromLastAmt>0){
				 irrPay.setRntAmt(DecimalUtils.sub(pay.getRntAmt(), subFromLastAmt));
			 }else{
				 irrPay.setRntAmt(pay.getRntAmt());
			 }
			  subFromLastAmt = DecimalUtils.sub(subFromLastAmt, pay.getRntAmt());
			 payPrpsList.add(irrPay);
		}
		 this.sortPrjPayList(payPrpsList);
		 for (int i=0;i<payPrpsList.size();i++) {
			 cashFlows[i+1] = payPrpsList.get(i).getRntAmt();
		  }
		 irrRate = DecimalUtils.round(ProjectUtils.getIRR(cashFlows, Double.NaN)*12*100, 2);
		 prjQuatPrps.setIrrPct(irrRate);
		 this.judgeLowRateBusinessIrr(prjQuatPrps);
		 prjQuatPrps.setTotalRntAmt(totalRntAmt);
		 prjQuatPrps.setTotalPrinAmt(totalPrinAmt);
		 prjQuatPrps.setTotalIntAmt(totalIntAmt);
		 prjQuatPrps.setTotalRemPrinAmt(totalRemPrinAmt);
		 prjQuatPrps.setFirstPayAmt(firstPayAmt);
		 prjQuatPrps.setPrjQuatPrpsPaySchList(prjQuatPrpsPaySchList);
         prjQuatPrps.setTempPayList(prjQuatPrpsPaySchList);
         this.getCstIrrRate(prjQuatPrps);
		 }
		return prjQuatPrps;
	}


	private PrjQuatPrpsVO prjQuatPrpsCalculateForNormal(PrjQuatPrpsVO prjQuatPrps) {
		 List<PrjQuatPrpsPaySchVO> prjQuatPrpsPaySchList = new ArrayList<PrjQuatPrpsPaySchVO>();
		 List<PrjQuatPrpsPaySchVO> prjPayList = new ArrayList<PrjQuatPrpsPaySchVO>();
		 List<PrjQuatPrpsPaySchVO> tempPayList = new ArrayList<PrjQuatPrpsPaySchVO>();
		 List<PrjQuatPrpsPaySchVO> prjQuatPayList = null;
			 double  totalRntAmt = 0d;//合计租金
			 double  totalPrinAmt = 0d;//合计本金
			 double  totalIntAmt = 0d;//合计利息
			 double totalRemPrinAmt = 0d;//合计剩余本金
			 double firstPayAmt = 0d;//首付款
			 boolean isBegiEqualFlag = false;//计算时是否是按期初等额本息计算第一期利息
			List<PrjQuatPrpsPaySchVO> payList = prjQuatPrps.getPrjQuatPrpsPaySchList();
		 int lsPd =0;//租期
		 double MonthRate = 0d;//月利率
		 double totalInsAmt = 0d;//保险总额
		 double chanStatAmt = 0d;//充电桩费用
		 if(null!=prjQuatPrps){
			 if(null==prjQuatPrps.getLsPd()||prjQuatPrps.getLsPd().intValue()==0){
					throw new BaseException(BaseExceptionConstant.BASE_EXCEPTION_CODE_600,"租期不能为空！");
			 }
			 int feeScale = 0; //费用小数位
			 int annIntScale = 0; //年利率小数位
			 int floatScale = 0; //上浮小数位数
			//根据事业部获取小数位数
			Map<String,String> decDigitsMap =  this.getDecimalDigitsByBuOrgCode();
			 if(!decDigitsMap.isEmpty()){
				 annIntScale = Integer.valueOf(decDigitsMap.get(PrjQuatPrpsConstant.CODE_ANNINT_RATE_NUM_CD));
				 floatScale = Integer.valueOf(decDigitsMap.get(PrjQuatPrpsConstant.CODE_FLOAT_RATE_NUM_CD));
				 feeScale =  Integer.valueOf(decDigitsMap.get(PrjQuatPrpsConstant.CODE_FEE_DECI_NUM_CD));
			 }else{
				 //没有查询到默认按10小数计算
				 feeScale = PrjQuatPrpsConstant.CODE_FEE_DECI_DEF_NUM; //费用小数位
				 annIntScale = PrjQuatPrpsConstant.CODE_ANNINT_RATE_DEF_NUM; //年利率小数位
				 floatScale = PrjQuatPrpsConstant.CODE_FLOAT_RATE_DEF_NUM; //上浮小数位数
			 }

			lsPd = prjQuatPrps.getLsPd().intValue();
			//月利率= 年利率/12
			MonthRate = DecimalUtils.div(DecimalUtils.round(prjQuatPrps.getAnnIntRatePct(), annIntScale),12);
			double dowePay = 0d;//首期租金
			double finacAmt = 0d;//融资额
			double contAmt = prjQuatPrps.getTotLsItmAmt();
			//方案费用明细
		if(CollectionUtils.isNotEmpty(prjQuatPrps.getPrjQuatPrpsFeelist())){
			//首期租金
			double firstRntAmt = 0d;
			for (PrjQuatPrpsFeeVO firstDetail : prjQuatPrps.getPrjQuatPrpsFeelist()) {
				if(firstDetail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_DOWNPAY)){
					firstRntAmt = ProjectUtils.getFirstAmt(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),firstDetail.getCalBaseCd(),firstDetail.getFeePct());
				}
				//保险总额
				if(firstDetail.getFeeTypCd().equals(PrjQuatPrpsFeeConstant.FEE_TYP_CD_32)){
					totalInsAmt = firstDetail.getFeeAmt();
				}
				//充电桩
				if(firstDetail.getFeeTypCd().equals(PrjQuatPrpsFeeConstant.FEE_TYP_CD_40)){
					chanStatAmt =  firstDetail.getFeeAmt();
				}
				//合同额= 设备款+计入合同额费用项
				if(firstDetail.getCntWayCd().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CNT_WAY_CONT)){
					//计入融资额的费用项
					if(null!=firstDetail.getFeePct()){
						//按比计算
						double amt =  DecimalUtils.round(ProjectUtils.getAmtByCalBase(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),firstRntAmt,firstDetail.getCalBaseCd(),DecimalUtils.round(firstDetail.getFeePct(),feeScale)),0);
						firstDetail.setFeeAmt(amt);
						contAmt=DecimalUtils.add(amt, contAmt);
					}else{
						//固定值
						contAmt=DecimalUtils.add(firstDetail.getFeeAmt(), contAmt);
					}
				}
			}

			for (int i=0; i<prjQuatPrps.getPrjQuatPrpsFeelist().size();i++) {
				PrjQuatPrpsFeeVO detail  = prjQuatPrps.getPrjQuatPrpsFeelist().get(i);
				if(detail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_DOWNPAY)){
					dowePay = detail.getFeeAmt();
				/*	if(prjBscInfoDTO.getPrjTypCd().equals(PrjBscInfoConstant.PRJ_TYP_CD_XSHZ)){
					}else{
					dowePay =DecimalUtils.round(ProjectUtils.getFirstAmt(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),detail.getCalBaseCd(), DecimalUtils.round(detail.getFeePct(),feeScale)), 0);
					}*/
					firstPayAmt=DecimalUtils.add(dowePay, firstPayAmt);
					//如果计算基数为首期基数重新计算比例信息，计算基数=车价+年保+充电桩
					if(detail.getCalBaseCd().equals(PrjQuatPrpsConstant.CODE_CAL_BASE_FIRSTPAY)){
						double baseAmt = prjQuatPrps.getTotLsItmAmt()+totalInsAmt+chanStatAmt;
						double  pct = firstPayAmt/baseAmt*100;
						detail.setFeePct(pct);
					}
					continue;
				}
				//留购价要乘以产品数量
				//除去留购价和首期租金的其他费用
				if(/*!detail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_PURCH_PRICE)&&*/!detail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_DOWNPAY)){
				if(detail.getCntWayCd().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CNT_WAY_DOWNPAY)){
					//计入首期款的费用项
					if(detail.getIsFixedAmt().equals(BaseConstant.IS_YESNO_NO)){
						//按比计算
						double amt =0d;
						if(detail.getCalBaseCd().equals(PrjQuatPrpsConstant.CODE_CAL_BASE_CONSLT)){
							amt = detail.getFeeAmt();
							double baseAmt = prjQuatPrps.getTotLsItmAmt()+chanStatAmt-firstPayAmt;
							double  pct = amt/baseAmt*100;
							detail.setFeePct(pct);
						}else if(detail.getCalBaseCd().equals(PrjQuatPrpsConstant.CODE_CAL_BASE_GUAR)){
							amt = detail.getFeeAmt();
							double baseAmt = prjQuatPrps.getTotLsItmAmt()+totalInsAmt+chanStatAmt-firstPayAmt;
							double  pct = amt/baseAmt*100;
							detail.setFeePct(pct);
						}else{
							amt = DecimalUtils.round(ProjectUtils.getAmtByCalBase(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),firstRntAmt,detail.getCalBaseCd(),DecimalUtils.round(detail.getFeePct(),feeScale)),0);
						}
						detail.setFeeAmt(amt);
						firstPayAmt=DecimalUtils.add(amt, firstPayAmt);
					}else{
						//固定值
						firstPayAmt=DecimalUtils.add(detail.getFeeAmt(), firstPayAmt);
					}
					continue;
				}
				if(detail.getCntWayCd().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CNT_WAY_FINANC)){
					//计入融资额的费用项
					if(null!=detail.getFeePct()){
						//按比计算
						double amt =  0d;
						if(detail.getCalBaseCd().equals(PrjQuatPrpsConstant.CODE_CAL_BASE_CONSLT)){
							amt = detail.getFeeAmt();
							double baseAmt = prjQuatPrps.getTotLsItmAmt()+chanStatAmt-firstPayAmt;
							double  pct = amt/baseAmt*100;
							detail.setFeePct(pct);
						}else if(detail.getCalBaseCd().equals(PrjQuatPrpsConstant.CODE_CAL_BASE_GUAR)){
							amt = detail.getFeeAmt();
							double baseAmt = prjQuatPrps.getTotLsItmAmt()+totalInsAmt+chanStatAmt-firstPayAmt;
							double  pct = amt/baseAmt*100;
							detail.setFeePct(pct);
						}else{
						amt = DecimalUtils.round(ProjectUtils.getAmtByCalBase(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),firstRntAmt,detail.getCalBaseCd(),DecimalUtils.round(detail.getFeePct(),feeScale)),0);
						}
						detail.setFeeAmt(amt);
						finacAmt=DecimalUtils.add(amt, finacAmt);
					}else{
						//固定值
						finacAmt=DecimalUtils.add(detail.getFeeAmt(), finacAmt);
					}
				}
				}

			}

		}

		//融资额 = 合同额-首期租金
		finacAmt = DecimalUtils.add(finacAmt, DecimalUtils.sub(prjQuatPrps.getContAmt(), dowePay));//实际融资额
		prjQuatPrps.setActLsAmt(finacAmt);
		double afterFirstRemPrinAmt = 0d;//第一期后的剩余本金
		 if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_END_NO_EQUAL)||prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_BEGI_NO_EQUAL)){
			 //不等额计算 期末不等额（暂时不考虑期初不等额）
			 Map<Integer, Double> rntMap = new HashMap<Integer, Double>();
			 Map<Integer, Integer> modifyFlagMap = new HashMap<Integer, Integer>();//设置是否修改状态
			 int type=0;
			 if(CollectionUtils.isNotEmpty(payList)){
				 this.sortPrjPayList(payList);
				 if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_BEGI_NO_EQUAL)){
					 type = 1;
					 isBegiEqualFlag = true;
				 }
				 if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_END_NO_EQUAL)){
					 type = 0;
				 }
				 for (PrjQuatPrpsPaySchVO prjQuatPrpsPaySchVO : payList) {
					 if(null==prjQuatPrpsPaySchVO.getIsModify()||prjQuatPrpsPaySchVO.getIsModify().equals(BaseConstant.IS_YESNO_NO)){
						 modifyFlagMap.put(prjQuatPrpsPaySchVO.getPayPd().intValue(), BaseConstant.IS_YESNO_NO);
					 }else{
						 modifyFlagMap.put(prjQuatPrpsPaySchVO.getPayPd().intValue(), BaseConstant.IS_YESNO_YES);
					 }
					if(null!=prjQuatPrpsPaySchVO.getIsModify()&&prjQuatPrpsPaySchVO.getIsModify().equals(BaseConstant.IS_YESNO_YES)){
						rntMap.put(prjQuatPrpsPaySchVO.getPayPd().intValue(), prjQuatPrpsPaySchVO.getRntAmt());
					}
				}
			 }
			 tempPayList = prjQuatPrpsPaySchList;
		 }else{
			double totalAmt = 0d;//每期的本金和
			double totalRnt = 0d;//每期租金和
			for(int i=1;i<=lsPd;i++){
				PrjQuatPrpsPaySchVO pay = new PrjQuatPrpsPaySchVO();
				PrjQuatPrpsPaySchVO tmpPay = new PrjQuatPrpsPaySchVO();
				tmpPay.setPayPd(Long.valueOf(i));
				pay.setPayPd(Long.valueOf(i));
				double  rntAmt = 0d;//租金
				double  prinAmt = 0d;//本金
				double  intAmt = 0d;//利息
				double remPrinAmt = 0d;//剩余本金

				double  tmpRntAmt = 0d;//租金
				double  tmpPrinAmt = 0d;//本金
				double  tmpIntAmt = 0d;//利息
				double tmpRemPrinAmt = 0d;//剩余本金

				//-----------------------------------------等额期初/期末本金计算----------------------------------------------------------------------//
				if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_BEGI_EQUAL__PRINC)
						||prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_END_EQUAL__PRINC)){
					//本金=融资额/租期
					prinAmt =DecimalUtils.round( DecimalUtils.div(finacAmt, lsPd),0);
					if(i==1){
						//第一期的利息为0
						intAmt = 0;
						totalAmt = DecimalUtils.add(prinAmt, totalAmt);

						//第一期的剩余本金=融资额-本金
						remPrinAmt = DecimalUtils.sub(finacAmt, prinAmt);
						afterFirstRemPrinAmt = remPrinAmt;
						rntAmt = DecimalUtils.add(prinAmt, intAmt);
						totalRnt =  DecimalUtils.add(rntAmt, totalRnt);
						prjQuatPrps.setEachEstRntAmt(rntAmt);
					}else if(i==lsPd){
						//最后一期的本金
						intAmt = DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)),0);
						rntAmt = DecimalUtils.add(prinAmt, intAmt);
						//最后一期剩余本金=0
						remPrinAmt = 0;
					}else{
						totalAmt = DecimalUtils.add(prinAmt, totalAmt);
						//利息= 月利率*上一期的剩余本金
						intAmt = DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)),0);
						//租金= 本金+利息
						rntAmt = DecimalUtils.add(prinAmt, intAmt);
						totalRnt =  DecimalUtils.add(rntAmt, totalRnt);
						//剩余本金= 上一期的剩余本金-本金
						remPrinAmt = DecimalUtils.sub(afterFirstRemPrinAmt, prinAmt);
						afterFirstRemPrinAmt = remPrinAmt;
					}


				}
//-----------------------------------------等额本息(期初/期末)----------------------------------------------------------------------//
				if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_BEGI_EQUAL__PRINC_INTER)){
					//期初等额本息
					//租金
					rntAmt =DecimalUtils.round(ProjectUtils.getPMT(DecimalUtils.div(MonthRate, 100), lsPd, finacAmt, 0, 1),0);
					tmpRntAmt =DecimalUtils.round(ProjectUtils.getPMT(DecimalUtils.div(MonthRate, 100), lsPd, finacAmt, 0, 1),PrjQuatPrpsConstant.CODE_FEE_DECI_DEF_NUM);

					if(i==1){
						//第一期利息为0
						intAmt = 0;
						//本金
						totalRnt =  DecimalUtils.add(rntAmt, totalRnt);
						prinAmt = DecimalUtils.sub(rntAmt, intAmt);
						//剩余本金
						remPrinAmt = DecimalUtils.sub(finacAmt, prinAmt);
						afterFirstRemPrinAmt = remPrinAmt;
						prjQuatPrps.setEachEstRntAmt(rntAmt);
					}else if(i==lsPd){
						//当年利率为0时，最后一期租金等于融资额-除去最后一期租金之和
						//利息=上一期的剩余本金*月利率
						intAmt = DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)),0);
						//最后一期本金=上一期的剩余本金
						if(prjQuatPrps.getAnnIntRatePct().doubleValue()!=0d){
							prinAmt = afterFirstRemPrinAmt;
						}else{
							prinAmt = DecimalUtils.sub(rntAmt, intAmt);
						}//2017-02-28 修改
						//最后一期剩余本金=0
						remPrinAmt = 0;
						afterFirstRemPrinAmt = remPrinAmt;
					}else{
						totalRnt =  DecimalUtils.add(rntAmt, totalRnt);
						//利息
						intAmt = DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)),0);
						//本金
						prinAmt = DecimalUtils.sub(rntAmt, intAmt);
						//剩余本金= 上一期的剩余本金-本金
						remPrinAmt = DecimalUtils.sub(afterFirstRemPrinAmt, prinAmt);
						afterFirstRemPrinAmt = remPrinAmt;
					}
				}
				//期末等额本息
				if(prjQuatPrps.getPayWayCd().equals(PrjQuatPrpsConstant.CODE_END_EQUAL__PRINC_INTER)){
					//租金
					rntAmt = DecimalUtils.round(ProjectUtils.getPMT(DecimalUtils.div(MonthRate, 100), lsPd, finacAmt, 0, 0),0);
					tmpRntAmt = DecimalUtils.round(ProjectUtils.getPMT(DecimalUtils.div(MonthRate, 100), lsPd, finacAmt, 0, 0),PrjQuatPrpsConstant.CODE_FEE_DECI_DEF_NUM);
					if(i==1){
						totalAmt = DecimalUtils.add(prinAmt, totalAmt);
						//利息 = 融资额*月利率
						intAmt = DecimalUtils.round(DecimalUtils.mul(finacAmt, DecimalUtils.div(MonthRate, 100)),0);
						//本金
						prinAmt = DecimalUtils.sub(rntAmt, intAmt);
						//剩余本金
						remPrinAmt = DecimalUtils.sub(finacAmt, prinAmt);
						afterFirstRemPrinAmt = remPrinAmt;
						prjQuatPrps.setEachEstRntAmt(rntAmt);
						totalRnt =  DecimalUtils.add(rntAmt, totalRnt);
					}else if(i==lsPd){
						//利息=上一期的剩余本金*月利率
						intAmt = DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)),0);
						//最后一期本金=上一期的剩余本金
						//最后一期本金=上一期的剩余本金
						if(prjQuatPrps.getAnnIntRatePct().doubleValue()!=0d){
							prinAmt = afterFirstRemPrinAmt;
						}else{
							prinAmt = DecimalUtils.sub(rntAmt, intAmt);
						}//2017-02-28 修改
						//最后一期剩余本金=0
						remPrinAmt = 0;
						afterFirstRemPrinAmt = remPrinAmt;
					}else{
						totalAmt = DecimalUtils.add(prinAmt, totalAmt);
						//利息
						intAmt = DecimalUtils.round(DecimalUtils.mul(afterFirstRemPrinAmt, DecimalUtils.div(MonthRate, 100)),0);
						//本金
						prinAmt = DecimalUtils.sub(rntAmt, intAmt);
						//剩余本金= 上一期的剩余本金-本金
						remPrinAmt = DecimalUtils.sub(afterFirstRemPrinAmt, prinAmt);
						afterFirstRemPrinAmt = remPrinAmt;
						totalRnt =  DecimalUtils.add(rntAmt, totalRnt);
					}
				}
				totalRntAmt = DecimalUtils.add(totalRntAmt, rntAmt);
				totalPrinAmt = DecimalUtils.add(totalPrinAmt, prinAmt);
				totalIntAmt = DecimalUtils.add(totalIntAmt, intAmt);
				totalRemPrinAmt = DecimalUtils.add(totalRemPrinAmt, remPrinAmt);
				pay.setIntAmt(intAmt);
				pay.setRemPrinAmt(remPrinAmt);
				pay.setRntAmt(rntAmt);
				pay.setPrinAmt(prinAmt);
				pay.setIsModify(BaseConstant.IS_YESNO_NO);
				prjQuatPrpsPaySchList.add(pay);

				tmpPay.setRntAmt(tmpRntAmt);
				tempPayList.add(tmpPay);
			}
		}



	       }

		 prjQuatPrps.setTotalRntAmt(totalRntAmt);
		 prjQuatPrps.setTotalPrinAmt(totalPrinAmt);
		 prjQuatPrps.setTotalIntAmt(totalIntAmt);
		 prjQuatPrps.setTotalRemPrinAmt(totalRemPrinAmt);
		 prjQuatPrps.setFirstPayAmt(firstPayAmt);

		 sortPrjPayList(prjQuatPrps.getPrjQuatPrpsPaySchList());

		 sortPrjPayList(tempPayList);
		 prjQuatPrps.setPrjQuatPrpsPaySchList(prjQuatPrpsPaySchList);
		 double firstAmt = 0d;//第一期金额
		 for (PrjQuatPrpsFeeVO feeVO : prjQuatPrps.getPrjQuatPrpsFeelist()) {
			if(feeVO.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_DOWNPAY)){
				firstAmt = feeVO.getFeeAmt();
				break;
			}
		}
		 //计算IRR
		 double irrRate = 0d;
		 double[]  cashFlows =new double[prjQuatPrps.getLsPd().intValue()+1];
		 List<SysDictionaryDTO>  dicList =  this.sysDictionaryApiService.searchGroup(CurrentThreadContext.getCurrentSysCd(), CurrentThreadContext.getCurrentOrgCd(),DictionaryConstant.CODE_QUAT_IRR_FEE_CD );
		 List<SysDictionaryDTO>  subDicList =  this.sysDictionaryApiService.searchGroup(prjQuatPrps.getSysCd(), prjQuatPrps.getOrgCd(),DictionaryConstant.CODE_IRR_SUB_CD );
		 double addAmt = 0d;
		 double subAmt = 0d;
		 double subFromLastAmt =0d;//从最后一期向上减的费用项
		 if(CollectionUtils.isNotEmpty(dicList)){
			 for (SysDictionaryDTO sysDictionaryDTO : dicList) {
				 for (PrjQuatPrpsFeeVO feeVO : prjQuatPrps.getPrjQuatPrpsFeelist()) {
					if(sysDictionaryDTO.getCode().equals(feeVO.getFeeTypCd())){
						if(sysDictionaryDTO.getCodeAttr1().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CASH_FLOW_IN)){
							addAmt = DecimalUtils.add(addAmt, feeVO.getFeeAmt());
						}
						if(sysDictionaryDTO.getCodeAttr1().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CASH_FLOW_OUT)){
							subAmt = DecimalUtils.add(subAmt, feeVO.getFeeAmt());
						}
					}
				}
			}
		 }
	  	 if(CollectionUtils.isNotEmpty(subDicList)){
			 for (SysDictionaryDTO sysDictionaryDTO : subDicList) {
				 for (PrjQuatPrpsFeeVO feeVO : prjQuatPrps.getPrjQuatPrpsFeelist()) {
					 if(sysDictionaryDTO.getCode().equals(feeVO.getFeeTypCd())){
								 if(sysDictionaryDTO.getCodeAttr1().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CASH_FLOW_IN)){
									 subFromLastAmt = DecimalUtils.add(subFromLastAmt, feeVO.getFeeAmt());
								 }
								 if(sysDictionaryDTO.getCodeAttr1().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CASH_FLOW_OUT)){
									 subFromLastAmt = DecimalUtils.sub(subFromLastAmt, feeVO.getFeeAmt());
								 }
					 }

				}
			 }
	  	 }
		 //查询融资额中添加的费用项
		 //查询要减去的费用项
	 	double tmpActLsAmt = DecimalUtils.sub(prjQuatPrps.getContAmt(), firstAmt);
		 cashFlows[0]=(DecimalUtils.sub(DecimalUtils.add(-tmpActLsAmt, addAmt),subAmt));
		 List<PrjQuatPrpsPaySchVO> payPrpsList = new ArrayList<PrjQuatPrpsPaySchVO>();
		 for (int i=tempPayList.size()-1;i>=0;i--) {
			 PrjQuatPrpsPaySchVO pay  = tempPayList.get(i);
			 PrjQuatPrpsPaySchVO irrPay = new PrjQuatPrpsPaySchVO();
			 irrPay.setPayPd(pay.getPayPd());
			 if(subFromLastAmt>=pay.getRntAmt()){
					 irrPay.setRntAmt(0d);
			 }else if(subFromLastAmt<pay.getRntAmt()&&subFromLastAmt>0){
				 irrPay.setRntAmt(DecimalUtils.sub(pay.getRntAmt(), subFromLastAmt));
			 }else{
				 irrPay.setRntAmt(pay.getRntAmt());
			 }
			  subFromLastAmt = DecimalUtils.sub(subFromLastAmt, pay.getRntAmt());
			 payPrpsList.add(irrPay);
		}
		 this.sortPrjPayList(payPrpsList);
		 for (int i=0;i<payPrpsList.size();i++) {
			 cashFlows[i+1] = payPrpsList.get(i).getRntAmt();
		  }
		 irrRate = DecimalUtils.round(ProjectUtils.getIRR(cashFlows, Double.NaN)*12*100, 2);
		 prjQuatPrps.setIrrPct(irrRate);
		return prjQuatPrps;
	}


	//新能源只租业务方案信息
	private PrjQuatPrpsVO prjQuatPrpsCalculateForNewEnergy(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO =PrjQuatPrpsVOTransform.toVO(this.prjQuatPrpsApiService.prjQuatPrpsCalculateForNewEnergy(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
		return prpsVO;
	}


	//汽车金融--工行产品
	private PrjQuatPrpsVO prjQuatPrpsCalculateForQCJRGH(PrjQuatPrpsVO prjQuatPrps) {
		 List<PrjQuatPrpsPaySchVO> prjQuatPrpsPaySchList = new ArrayList<PrjQuatPrpsPaySchVO>();
		 List<PrjQuatPrpsPaySchVO> prjPayList = new ArrayList<PrjQuatPrpsPaySchVO>();
			 double  totalRntAmt = 0d;//合计租金
			 double  totalPrinAmt = 0d;//合计本金
			 double  totalIntAmt = 0d;//合计利息
			 double totalRemPrinAmt = 0d;//合计剩余本金
			 double firstPayAmt = 0d;//首付款
			 double irrRate = 0d;
			List<PrjQuatPrpsPaySchVO> payList = prjQuatPrps.getPrjQuatPrpsPaySchList();
		 int lsPd =0;//租期
		 double MonthRate = 0d;//月利率
		 if(null!=prjQuatPrps){
			 if(null==prjQuatPrps.getLsPd()||prjQuatPrps.getLsPd().intValue()==0){
					throw new BaseException(BaseExceptionConstant.BASE_EXCEPTION_CODE_600,"租期不能为空！");
			 }
			 int feeScale = 0; //费用小数位
			 int annIntScale = 0; //年利率小数位
			 int floatScale = 0; //上浮小数位数
			//根据事业部获取小数位数
			Map<String,String> decDigitsMap =  this.getDecimalDigitsByBuOrgCode();
			 if(!decDigitsMap.isEmpty()){
				 annIntScale = Integer.valueOf(decDigitsMap.get(PrjQuatPrpsConstant.CODE_ANNINT_RATE_NUM_CD));
				 floatScale = Integer.valueOf(decDigitsMap.get(PrjQuatPrpsConstant.CODE_FLOAT_RATE_NUM_CD));
				 feeScale =  Integer.valueOf(decDigitsMap.get(PrjQuatPrpsConstant.CODE_FEE_DECI_NUM_CD));
			 }else{
				 //没有查询到默认按10小数计算
				 feeScale = PrjQuatPrpsConstant.CODE_FEE_DECI_DEF_NUM; //费用小数位
				 annIntScale = PrjQuatPrpsConstant.CODE_ANNINT_RATE_DEF_NUM; //年利率小数位
				 floatScale = PrjQuatPrpsConstant.CODE_FLOAT_RATE_DEF_NUM; //上浮小数位数
			 }

			lsPd = prjQuatPrps.getLsPd().intValue();
			//月利率= 年利率/12
		//	MonthRate = DecimalUtils.div(DecimalUtils.round(prjQuatPrps.getAnnIntRatePct(), annIntScale),12);
			double dowePay = 0d;//首期租金
			double finacAmt = 0d;//融资额
			double tempFinalAmt = 0d;
			//方案费用明细
		if(CollectionUtils.isNotEmpty(prjQuatPrps.getPrjQuatPrpsFeelist())){
			//首期租金
			double firstRntAmt = 0d;
			for (PrjQuatPrpsFeeVO firstDetail : prjQuatPrps.getPrjQuatPrpsFeelist()) {
				if(firstDetail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_DOWNPAY)){
					firstRntAmt = ProjectUtils.getFirstAmt(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),firstDetail.getCalBaseCd(),firstDetail.getFeePct());
				}
			}
			for (int i=0; i<prjQuatPrps.getPrjQuatPrpsFeelist().size();i++) {
				PrjQuatPrpsFeeVO detail  = prjQuatPrps.getPrjQuatPrpsFeelist().get(i);
				if(detail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_DOWNPAY)){
					dowePay =DecimalUtils.round(ProjectUtils.getFirstAmt(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),detail.getCalBaseCd(), DecimalUtils.round(detail.getFeePct(),feeScale)), 0);
					firstPayAmt=DecimalUtils.add(dowePay, firstPayAmt);
					continue;
				}
				//除去留购价和首期租金的其他费用
				if(!detail.getFeeTypCd().equals(PrjQuatPrpsConstant.CODE_FEE_WAY_TYPE_DOWNPAY)){
				if(detail.getCntWayCd().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CNT_WAY_DOWNPAY)){
					//计入首期款的费用项
					if(detail.getIsFixedAmt().equals(BaseConstant.IS_YESNO_NO)){
						//按比计算
						double amt = 0d;
					/*	if (detail.getFeeTypCd().equals(PrjQuatPrpsFeeConstant.PRJ_FEE_TYP_CONSULT_1)) {
							double pct = detail.getFeePct()+(prjQuatPrps.getSplBackPct()==null?0d:prjQuatPrps.getSplBackPct().doubleValue());
							amt = DecimalUtils.round(ProjectUtils.getAmtByCalBase(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),firstRntAmt,detail.getCalBaseCd(),DecimalUtils.round(pct,feeScale)),0);
						}else{*/
							amt = DecimalUtils.round(ProjectUtils.getAmtByCalBase(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),firstRntAmt,detail.getCalBaseCd(),DecimalUtils.round(detail.getFeePct(),feeScale)),0);
						//}
						detail.setFeeAmt(amt);
						firstPayAmt=DecimalUtils.add(amt, firstPayAmt);
					}else{
						//固定值
						firstPayAmt=DecimalUtils.add(detail.getFeeAmt(), firstPayAmt);
					}
					continue;
				}
				if(detail.getCntWayCd().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CNT_WAY_FINANC)){
					//计入融资额的费用项
					if(null!=detail.getFeePct()){
						//按比计算
						double amt = 0d;
						//按比计 算
					/*	if (detail.getFeeTypCd().equals(PrjQuatPrpsFeeConstant.PRJ_FEE_TYP_CONSULT_1)) {
							//咨询费 = 咨询费+供应商返利的金额
							double pct = detail.getFeePct()+(prjQuatPrps.getSplBackPct()==null?0d:prjQuatPrps.getSplBackPct().doubleValue());
							 amt =   DecimalUtils.round(ProjectUtils.getAmtByCalBase(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),firstRntAmt,detail.getCalBaseCd(),DecimalUtils.round(pct,feeScale)),0);
						}else{*/
							 amt =   DecimalUtils.round(ProjectUtils.getAmtByCalBase(prjQuatPrps.getTotLsItmAmt(),prjQuatPrps.getContAmt(),firstRntAmt,detail.getCalBaseCd(),DecimalUtils.round(detail.getFeePct(),feeScale)),0);
					//	}
						detail.setFeeAmt(amt);
						finacAmt=DecimalUtils.add(amt, finacAmt);
					}else{
						//固定值
						finacAmt=DecimalUtils.add(detail.getFeeAmt(), finacAmt);
					}
				}
				}
			}

		}

		//融资额 = 合同额-首期租金
		finacAmt = DecimalUtils.add(finacAmt, DecimalUtils.sub(prjQuatPrps.getContAmt(), dowePay));//实际融资额
		tempFinalAmt = DecimalUtils.add(tempFinalAmt, DecimalUtils.sub(prjQuatPrps.getContAmt(), dowePay));//实际融资额

		prjQuatPrps.setActLsAmt(finacAmt);
		double afterFirstRemPrinAmt = 0d;//第一期后的剩余本金
		//工行利率
		double bankRate = 0d;
/*		List<SysDictionaryDTO>  bankDictList = this.sysDictionaryApiService.searchGroup(prjQuatPrps.getSysCd(), prjQuatPrps.getOrgCd(), DictionaryConstant.CODE_SERVICE_RATE_CD);
		if(CollectionUtils.isNotEmpty(bankDictList)){
			for (SysDictionaryDTO sysDictionaryDTO : bankDictList) {
				if(Integer.valueOf(sysDictionaryDTO.getCode()).compareTo(prjQuatPrps.getLsPd().intValue())==0){
					bankRate = Double.valueOf(sysDictionaryDTO.getCodeNm());
				}
			}
		}*/
		bankRate = prjQuatPrps.getAnnIntRatePct();
		double rate = DecimalUtils.div(DecimalUtils.div(bankRate, 100), prjQuatPrps.getLsPd().doubleValue());
		//平均月租
		double averageMonthRnt =DecimalUtils.round(DecimalUtils.div(finacAmt, prjQuatPrps.getLsPd().doubleValue())+DecimalUtils.mul(finacAmt,rate), 0) ;
		//总费率
		double totalRate =DecimalUtils.div((DecimalUtils.mul(averageMonthRnt, prjQuatPrps.getLsPd().doubleValue())-tempFinalAmt), tempFinalAmt);
		double quatIntAmt = DecimalUtils.mul(finacAmt, rate);
		double tmp = Math.floor(DecimalUtils.div(quatIntAmt, 100));
		quatIntAmt = DecimalUtils.mul(tmp, 100);
		double firstIntAmt = DecimalUtils.mul(DecimalUtils.mul(finacAmt, rate), prjQuatPrps.getLsPd().doubleValue())-DecimalUtils.mul(quatIntAmt, (prjQuatPrps.getLsPd().intValue()-1));
		double quatPrinAmt = DecimalUtils.div(finacAmt, prjQuatPrps.getLsPd().doubleValue());
		double tmpPrinAmt = Math.floor(DecimalUtils.div(quatPrinAmt, 100));
		quatPrinAmt = DecimalUtils.mul(tmpPrinAmt, 100);
		double firstPrintAmt = finacAmt-DecimalUtils.mul(quatPrinAmt, (prjQuatPrps.getLsPd().intValue()-1));
		 double[]  cashFlows =new double[prjQuatPrps.getLsPd().intValue()+1];
		 cashFlows[0]=-tempFinalAmt;
		for(int i=1;i<=lsPd;i++){
			PrjQuatPrpsPaySchVO pay = new PrjQuatPrpsPaySchVO();
			PrjQuatPrpsPaySchVO tmpPay = new PrjQuatPrpsPaySchVO();
			tmpPay.setPayPd(Long.valueOf(i));
			pay.setPayPd(Long.valueOf(i));
			double  rntAmt = 0d;//租金
			double remPrinAmt = 0d;//剩余本金
			double intAmt = 0d;
			double prinAmt  = 0d;
				if(i==1){
					intAmt = firstIntAmt;
					//本金
					prinAmt = firstPrintAmt;
					//租金
					rntAmt = DecimalUtils.add(intAmt,prinAmt);
					//剩余本金
					remPrinAmt = DecimalUtils.sub(finacAmt, prinAmt);
					afterFirstRemPrinAmt = remPrinAmt;
				}else if(i==lsPd){
					intAmt = quatIntAmt;
					prinAmt = quatPrinAmt;
					//租金
					rntAmt = DecimalUtils.add(intAmt,prinAmt);
					remPrinAmt = 0;
					afterFirstRemPrinAmt = remPrinAmt;
				}else{

					intAmt = quatIntAmt;
					prinAmt = quatPrinAmt;
					//租金
					rntAmt = DecimalUtils.add(intAmt,prinAmt);
					//剩余本金= 上一期的剩余本金-本金
					remPrinAmt = DecimalUtils.sub(afterFirstRemPrinAmt, prinAmt);
					afterFirstRemPrinAmt = remPrinAmt;
					if(i==2){
						prjQuatPrps.setEachEstRntAmt(rntAmt);
					}
				}
				 cashFlows[i] = rntAmt;
			totalRntAmt = DecimalUtils.add(totalRntAmt, rntAmt);
			totalPrinAmt = DecimalUtils.add(totalPrinAmt, prinAmt);
			totalIntAmt = DecimalUtils.add(totalIntAmt, intAmt);
			totalRemPrinAmt = DecimalUtils.add(totalRemPrinAmt, remPrinAmt);
			pay.setIntAmt(intAmt);
			pay.setRemPrinAmt(remPrinAmt);
			pay.setRntAmt(rntAmt);
			pay.setPrinAmt(prinAmt);
			pay.setIsModify(BaseConstant.IS_YESNO_NO);
			prjQuatPrpsPaySchList.add(pay);
		}

		 irrRate = DecimalUtils.round(ProjectUtils.getIRR(cashFlows, Double.NaN)*12*100, 2);
		 prjQuatPrps.setIrrPct(irrRate);
		 prjQuatPrps.setTotalRntAmt(totalRntAmt);
		 prjQuatPrps.setTotalPrinAmt(totalPrinAmt);
		 prjQuatPrps.setTotalIntAmt(totalIntAmt);
		 prjQuatPrps.setTotalRemPrinAmt(totalRemPrinAmt);
		 prjQuatPrps.setFirstPayAmt(firstPayAmt);
		 prjQuatPrps.setPrjQuatPrpsPaySchList(prjQuatPrpsPaySchList);
		 }
		return prjQuatPrps;
	}


	private PrjQuatPrpsVO prjQuatPrpsCalculateForZC(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO =PrjQuatPrpsVOTransform.toVO(this.projectApiService.prjQuatPrpsCalculateForZC(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
		return prpsVO;
	}


	private PrjQuatPrpsVO prjQuatPrpsCalculateForQCJR(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO =PrjQuatPrpsVOTransform.toVO(this.projectApiService.getPrjQuatTPrps(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
		return prpsVO;
	}


	//配平差额
	private void balancingDiffer(List<PrjQuatPrpsPaySchVO> prjQuatPrpsPaySchList,PrjQuatPrpsVO prjQuatPrps) {
		if(CollectionUtils.isNotEmpty(prjQuatPrpsPaySchList)){
			double totalRnt = 0d;
			double totalPrint = 0d;
			double totalInt = 0d;
			for (int i=0;i<prjQuatPrpsPaySchList.size();i++) {
				PrjQuatPrpsPaySchVO pay = prjQuatPrpsPaySchList.get(i);
				if(i==prjQuatPrpsPaySchList.size()-1){
					totalRnt = DecimalUtils.add(totalRnt, pay.getRntAmt());
					totalPrint = DecimalUtils.add(totalPrint, pay.getPrinAmt());
					totalInt =  DecimalUtils.add(totalInt, pay.getIntAmt());
					double sumInt = DecimalUtils.sub(totalRnt, totalPrint);//总利息
					double lastIntAmt = DecimalUtils.add(DecimalUtils.sub(sumInt, totalInt), pay.getIntAmt());
					pay.setIntAmt(lastIntAmt);
					prjQuatPrps.setTotalIntAmt(sumInt);
					prjQuatPrps.setTotalPrinAmt(totalPrint);
					prjQuatPrps.setTotalRemPrinAmt(0d);
					prjQuatPrps.setTotalRntAmt(totalRnt);

				}else{
					totalRnt = DecimalUtils.add(totalRnt, pay.getRntAmt());
					totalPrint = DecimalUtils.add(totalPrint, pay.getPrinAmt());
					totalInt =  DecimalUtils.add(totalInt, pay.getIntAmt());
				}
			}
		}
	}


	private PrjQuatPrpsVO convertPrjQuatPrpsYuanToFen(PrjQuatPrpsVO prjQuatPrps) {
		if(null!=prjQuatPrps){
			 prjQuatPrps.setTotalRntAmt(DecimalUtils.convertYuanToFen(prjQuatPrps.getTotalRntAmt()).doubleValue());
			 prjQuatPrps.setTotalPrinAmt(DecimalUtils.convertYuanToFen(prjQuatPrps.getTotalPrinAmt()).doubleValue());
			 prjQuatPrps.setTotalIntAmt(DecimalUtils.convertYuanToFen(prjQuatPrps.getTotalIntAmt()).doubleValue());
			 prjQuatPrps.setTotalRemPrinAmt(DecimalUtils.convertYuanToFen(prjQuatPrps.getTotalRemPrinAmt()).doubleValue());
			 prjQuatPrps.setFirstPayAmt(DecimalUtils.convertYuanToFen(prjQuatPrps.getFirstPayAmt()).doubleValue());
			 prjQuatPrps.setTotLsItmAmt(DecimalUtils.convertYuanToFen( prjQuatPrps.getTotLsItmAmt()).doubleValue());
			 prjQuatPrps.setContAmt(DecimalUtils.convertYuanToFen( prjQuatPrps.getContAmt()).doubleValue());
			 prjQuatPrps.setActLsAmt(DecimalUtils.convertYuanToFen(prjQuatPrps.getActLsAmt()).doubleValue());
			 prjQuatPrps.setEachEstRntAmt(DecimalUtils.convertYuanToFen(prjQuatPrps.getEachEstRntAmt()).doubleValue());
			 List<PrjQuatPrpsFeeVO> feeList = prjQuatPrps.getPrjQuatPrpsFeelist(); //项目费用明细
		     List<PrjQuatPrpsPaySchVO> prjQuatPrpsPaySchList = prjQuatPrps.getPrjQuatPrpsPaySchList();//项目支付表信息
				 for (PrjQuatPrpsPaySchVO pay : prjQuatPrpsPaySchList) {
					pay.setRntAmt(DecimalUtils.convertYuanToFen(pay.getRntAmt()).doubleValue());
					pay.setPrinAmt(DecimalUtils.convertYuanToFen(pay.getPrinAmt()).doubleValue());
					pay.setIntAmt(DecimalUtils.convertYuanToFen(pay.getIntAmt()).doubleValue());
					pay.setRemPrinAmt(DecimalUtils.convertYuanToFen(pay.getRemPrinAmt()).doubleValue());
				 }
				 for (PrjQuatPrpsFeeVO detail : feeList) {
					 detail.setFeeAmt(DecimalUtils.convertYuanToFen(detail.getFeeAmt()).doubleValue());
				 }
		}
		return prjQuatPrps;
	}


	private PrjQuatPrpsVO convertPrjQuatPrpsFenToYuan(PrjQuatPrpsVO prjQuatPrps) {
		if(null!=prjQuatPrps){
			if(null!=prjQuatPrps.getTotalRntAmt()){
				prjQuatPrps.setTotalRntAmt(DecimalUtils.convertFenToYuan(prjQuatPrps.getTotalRntAmt().longValue()));
			}
			if(null!=prjQuatPrps.getTotalPrinAmt()){
				prjQuatPrps.setTotalPrinAmt(DecimalUtils.convertFenToYuan(prjQuatPrps.getTotalPrinAmt().longValue()));
			}
			if(null!=prjQuatPrps.getTotalIntAmt()){
				prjQuatPrps.setTotalIntAmt(DecimalUtils.convertFenToYuan(prjQuatPrps.getTotalIntAmt().longValue()));
			}
			if(null!=prjQuatPrps.getTotalRemPrinAmt()){
				prjQuatPrps.setTotalRemPrinAmt(DecimalUtils.convertFenToYuan(prjQuatPrps.getTotalRemPrinAmt().longValue()));
			}
			if(null!=prjQuatPrps.getFirstPayAmt()){
				prjQuatPrps.setFirstPayAmt(DecimalUtils.convertFenToYuan(prjQuatPrps.getFirstPayAmt().longValue()));
			}
			if(null!=prjQuatPrps.getTotLsItmAmt()){
				prjQuatPrps.setTotLsItmAmt(DecimalUtils.convertFenToYuan( prjQuatPrps.getTotLsItmAmt().longValue()));
			}
			if(null!=prjQuatPrps.getContAmt()){
				prjQuatPrps.setContAmt(DecimalUtils.convertFenToYuan( prjQuatPrps.getContAmt().longValue()));
			}
			if(null!=prjQuatPrps.getActLsAmt()){
				prjQuatPrps.setActLsAmt(DecimalUtils.convertFenToYuan(prjQuatPrps.getActLsAmt().longValue()));
			}
			if(null!=prjQuatPrps.getEachEstRntAmt()){
				prjQuatPrps.setEachEstRntAmt(DecimalUtils.convertFenToYuan(prjQuatPrps.getEachEstRntAmt().longValue()));
			}
            if(null!=prjQuatPrps.getTenThouCoef()){
                prjQuatPrps.setTenThouCoef(DecimalUtils.convertFenToYuan(prjQuatPrps.getTenThouCoef().longValue()));
            }
			 List<PrjQuatPrpsFeeVO> feeList = prjQuatPrps.getPrjQuatPrpsFeelist(); //项目费用明细
		     List<PrjQuatPrpsPaySchVO> prjQuatPrpsPaySchList = prjQuatPrps.getPrjQuatPrpsPaySchList();//项目支付表信息
				 for (PrjQuatPrpsPaySchVO pay : prjQuatPrpsPaySchList) {
					pay.setRntAmt(DecimalUtils.convertFenToYuan(pay.getRntAmt().longValue()));
					pay.setPrinAmt(DecimalUtils.convertFenToYuan(pay.getPrinAmt().longValue()));
					pay.setIntAmt(DecimalUtils.convertFenToYuan(pay.getIntAmt().longValue()));
					pay.setRemPrinAmt(DecimalUtils.convertFenToYuan(pay.getRemPrinAmt().longValue()));
				 }
				 for (PrjQuatPrpsFeeVO detail : feeList) {
					 detail.setFeeAmt(DecimalUtils.convertFenToYuan(detail.getFeeAmt().longValue()));
				 }
				 if(null!=prjQuatPrps.getGhRntAmt()){
					 prjQuatPrps.setGhRntAmt(DecimalUtils.convertFenToYuan(prjQuatPrps.getGhRntAmt().longValue()));
				 }
				 if(null!=prjQuatPrps.getSzRntAmt()){
					 prjQuatPrps.setSzRntAmt(DecimalUtils.convertFenToYuan(prjQuatPrps.getSzRntAmt().longValue()));
				 }
				 if(null!=prjQuatPrps.getGhActLsAmt()){
					 prjQuatPrps.setGhActLsAmt(DecimalUtils.convertFenToYuan(prjQuatPrps.getGhActLsAmt().longValue()));
				 }
		}
		return prjQuatPrps;
	}


	@Override
	public boolean modifyIsFormalPrpsStatus(PrjQuatPrpsVO prjQuatPrps) {
		if(null==prjQuatPrps){
			throw new BaseException(BaseExceptionConstant.BASE_EXCEPTION_CODE_600,"项目方案参数不能为空！");
		}
		return this.projectApiService.modifyIsFormalPrpsStatus(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps));
	}


	@Override
	public List<PrjQuatPrpsVO> searchList(PrjQuatPrpsQueryCondition qc) throws BaseException {
		if(null==qc){
			throw new BaseException(BaseExceptionConstant.BASE_EXCEPTION_CODE_600,"项目方案参数不能为空！");
		}
		return PrjQuatPrpsVOTransform.toVOList(this.projectApiService.searchPrjQuatPrpsList(qc,CurrentThreadContext.getCurrentSysCd(),CurrentThreadContext.getCurrentOrgCd()));
	}

	private List<PrjQuatPrpsPaySchVO>sortPrjPayList(List<PrjQuatPrpsPaySchVO> prjPayList){
        Collections.sort(prjPayList, new Comparator<PrjQuatPrpsPaySchVO>(){
            public int compare(PrjQuatPrpsPaySchVO o1, PrjQuatPrpsPaySchVO o2) {
                if(o1.getPayPd() > o2.getPayPd()){
                    return 1;
                }
                if(o1.getPayPd() == o2.getPayPd()){
                    return 0;
                }
                return -1;
            }
      });
        return prjPayList;
	}

	public 	Map<String,String> getDecimalDigitsByBuOrgCode(){

		Map<String,String> decDigitsMap =  this.projectApiService.getDecimalDigitsByBuOrgCode(CurrentThreadContext.getCurrentSysCd(),CurrentThreadContext.getCurrentOrgCd());
		return decDigitsMap;
	}

    public 	Map<String,String> getDecimalDigitsByBuOrgCodeNew(String orgCd){

        Map<String,String> decDigitsMap =  this.projectApiService.getDecimalDigitsByBuOrgCode(CurrentThreadContext.getCurrentSysCd(),orgCd);
        return decDigitsMap;
    }


	@Override
	public boolean checkPrjPrdQuatPrpsFee(Long prjId) throws BaseException {
		if(null==prjId) return false;
		return this.projectApiService.checkPrjPrdQuatPrpsFee(prjId);
	}


	@Override
	public boolean checkMultiStepStatus(Integer payPd,String orgCd) throws BaseException {
		boolean flag = false;
		//根据事业部查询配置的阶梯价数据
		List<KeyValueVO> list = this.sysDictionaryApiService.getKvList(DictionaryConstant.CODE_QUAT_PER_PCT_CD,CurrentThreadContext.getCurrentSysCd(),orgCd);
		if(CollectionUtils.isEmpty(list)){
			return false;
		}
		for (KeyValueVO keyValueVO : list) {
			String[] keyArray  = keyValueVO.getKey().split("-");
			int  pd= Integer.valueOf(keyArray[0]);
			if(payPd.intValue()==pd){
				flag = true;
				break;
			}
		}

		return flag;
	}


	/*@Override
	public void splitQuatPaySch(Long id) throws BaseException {
		this.projectModifyApiService.modifySplitQuatPaySch(id,CurrentThreadContext.getCurrentSysCd(),CurrentThreadContext.getCurrentOrgCd(),CurrentThreadContext.getCurrentUserId());
	}
*/

	/*@Override
	public void modifyGenNomalPaySch(Long id) throws BaseException {

		this.projectModifyApiService.modifyGenNomalPaySch(id,CurrentThreadContext.getCurrentSysCd(),CurrentThreadContext.getCurrentOrgCd(),CurrentThreadContext.getCurrentUserId());
	}*/


	@Override
	public void removePrjQuatByPrjId(Long prjId) throws BaseException {
		this.projectModifyApiService.removePrjQuatByPrjId(prjId);
	}


	@Override
	public Long modifyGenPrjQuatPrpsAndPayInfo(PrjQuatPrpsVO prjQuatPrps) throws BaseException {
        PrjBscInfoVO prjBscInfoVO =  this.prjBscInfoService.selectById(prjQuatPrps.getPrjId());
        if(PrjBscInfoConstant.PRJ_TYP_CD_CDDYWYQ.equals(prjBscInfoVO.getPrjTypCd())){
			return projectModifyApiService.modifyGenPrjQuatPrpsAndPayInfoYQ(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps));
		}
        if(prjBscInfoVO.getBuOrgCd().equals(PrjBscInfoConstant.CODE_BU_ORG_CD_XNY)&&prjBscInfoVO.getBizTypCd().equals(PrjBscInfoConstant.PRJ_BIZ_TYP_CD_JYXZL)){
            return prjQuatPrpsXNYApiService.modifyGenPrjQuatPrpsAndPayInfo(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps));
        }else{
            return projectModifyApiService.modifyGenPrjQuatPrpsAndPayInfo(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps));
        }

	}


	@Override
	public void addPrpsQuatIRRPct() throws BaseException {
		this.projectModifyApiService.addPrpsQuatIRRPct();
	}


	@Override
	public double getInitLsPct(String currentSysCd, String buOrgCd) {
		double initLsPc = 0d;
		List<SysDictionaryDTO> payWayCdList = this.sysDictionaryApiService.searchGroup(currentSysCd, buOrgCd, DictionaryConstant.CODE_PRJ_QUAT_PAY_WAY_CD);
		//首年还款比例
		if(CollectionUtils.isNotEmpty(payWayCdList)){
			for (SysDictionaryDTO sysDictionaryDTO : payWayCdList) {
				if(sysDictionaryDTO.getCode().equals(PrjQuatPrpsConstant.CODE_MULTI__STEP_INTER_ZC)){
					initLsPc = Double.valueOf(sysDictionaryDTO.getCodeAttr1());
				}
			}
		}

		return initLsPc;
	}

	@Override
	public boolean getPrjQuatPrpsTempByPrjId(Long id) throws BaseException {
		return this.prjQuatPrpsApiService.getPrjQuatPrpsTempByPrjId(id);
	}
	@Override
	public void modifyDealZSChangeOurData() throws BaseException {
		this.prjQuatPrpsApiService.modifyDealZSChangeOurData();
	}
	//REQ-3756 36资管机构路由 by yaoxiurong 作废第三方资管城配,第三方资管传统 新增字段IS_INS_BIZ标识是否资管业务
//    @Override
//    public void modifyDealZgZyflChangeOurDataByPrjId(Long prjId,String sysCd,String crtUsrId) throws BaseException {
//        this.prjQuatPrpsApiService.modifyDealZgZyflChangeOurDataByPrjId(prjId,sysCd,crtUsrId);
//    }

    private double getMfrIrrRate2(PrjQuatPrpsVO prjQuatPrps) {
		 //计算IRR
		 double irrRate = 0d;
		 double[]  cashFlows =new double[prjQuatPrps.getLsPd().intValue()+1];
		 List<SysDictionaryDTO>  dicList =  this.sysDictionaryApiService.searchGroup(CurrentThreadContext.getCurrentSysCd(), CurrentThreadContext.getCurrentOrgCd(),DictionaryConstant.CODE_QUAT_IRR_FEE_CD );
		 List<SysDictionaryDTO>  subDicList =  this.sysDictionaryApiService.searchGroup(prjQuatPrps.getSysCd(), prjQuatPrps.getOrgCd(),DictionaryConstant.CODE_IRR_SUB_CD );
		 double addAmt = 0d;
		 double subAmt = 0d;
		 double subFromLastAmt =0d;//从最后一期向上减的费用项
		 if(CollectionUtils.isNotEmpty(dicList)){
			 for (SysDictionaryDTO sysDictionaryDTO : dicList) {
				 for (PrjQuatPrpsFeeVO feeVO : prjQuatPrps.getPrjQuatPrpsFeelist()) {
					if(sysDictionaryDTO.getCode().equals(feeVO.getFeeTypCd())&&(!(feeVO.getFeeTypCd().equals(PrjQuatPrpsFeeConstant.FEE_TYP_CD_52)))){
						if(sysDictionaryDTO.getCodeAttr1().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CASH_FLOW_IN)){
							addAmt = DecimalUtils.add(addAmt, feeVO.getFeeAmt());
						}
						if(sysDictionaryDTO.getCodeAttr1().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CASH_FLOW_OUT)){
							subAmt = DecimalUtils.add(subAmt, feeVO.getFeeAmt());
						}
					}
				}
			}
		 }
	  	 if(CollectionUtils.isNotEmpty(subDicList)){
			 for (SysDictionaryDTO sysDictionaryDTO : subDicList) {
				 for (PrjQuatPrpsFeeVO feeVO : prjQuatPrps.getPrjQuatPrpsFeelist()) {
					 if(sysDictionaryDTO.getCode().equals(feeVO.getFeeTypCd())){
								 if(sysDictionaryDTO.getCodeAttr1().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CASH_FLOW_IN)){
									 subFromLastAmt = DecimalUtils.add(subFromLastAmt, feeVO.getFeeAmt());
								 }
								 if(sysDictionaryDTO.getCodeAttr1().equals(PrjQuatPrpsConstant.CODE_PRJ_QUAT_CASH_FLOW_OUT)){
									 subFromLastAmt = DecimalUtils.sub(subFromLastAmt, feeVO.getFeeAmt());
								 }
					 }

				}
			 }
	  	 }
		 //查询融资额中添加的费用项
		 //查询要减去的费用项
		 cashFlows[0]=(DecimalUtils.sub(DecimalUtils.add(-prjQuatPrps.getActLsAmt(), addAmt),subAmt));
		 List<PrjQuatPrpsPaySchVO> payPrpsList = new ArrayList<PrjQuatPrpsPaySchVO>();
		 for (int i=prjQuatPrps.getTempPayList().size()-1;i>=0;i--) {
			 PrjQuatPrpsPaySchVO pay  = prjQuatPrps.getTempPayList().get(i);
			 PrjQuatPrpsPaySchVO irrPay = new PrjQuatPrpsPaySchVO();
			 irrPay.setPayPd(pay.getPayPd());
			 if(subFromLastAmt>=pay.getRntAmt()){
				// if(tmpAmt>=pay.getRntAmt()){
					 irrPay.setRntAmt(0d);
				// }
				// if(tmpAmt<pay.getRntAmt()){

				// }
			 }else if(subFromLastAmt<pay.getRntAmt()&&subFromLastAmt>0){
				 irrPay.setRntAmt(DecimalUtils.sub(pay.getRntAmt(), subFromLastAmt));
			 }else{
				 irrPay.setRntAmt(pay.getRntAmt());
			 }
			  subFromLastAmt = DecimalUtils.sub(subFromLastAmt, pay.getRntAmt());
			 payPrpsList.add(irrPay);
		}
		 this.sortPrjPayList(payPrpsList);
		 for (int i=0;i<payPrpsList.size();i++) {
			 cashFlows[i+1] = payPrpsList.get(i).getRntAmt();
		  }
		 irrRate = DecimalUtils.round(ProjectUtils.getIRR(cashFlows, Double.NaN)*12*100, 2);
		 prjQuatPrps.setIrrPct2(irrRate);
		return irrRate;
	}
	//新网银行
	private PrjQuatPrpsVO prjQuatPrpsCalculateForZGXWBANK(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO =PrjQuatPrpsVOTransform.toVO(this.prjQuatPrpsApiService.prjQuatPrpsCalculateForZGXWBANK(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
		return prpsVO;
	}
	//众邦银行
	private PrjQuatPrpsVO prjQuatPrpsCalculateForZGZBBANK(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO =PrjQuatPrpsVOTransform.toVO(this.prjQuatPrpsApiService.prjQuatPrpsCalculateForZGZBBANK(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
		return prpsVO;
	}
    /**
     * 兴邦金租报价测算
     */
    private PrjQuatPrpsVO prjQuatPrpsCalculateForZGXBFL(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO =PrjQuatPrpsVOTransform.toVO(this.insQuatPrpsAndPrdSchMApiService.prjQuatPrpsCalculateForZG(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
        return prpsVO;
    }
    /**
     * 江西金租报价测算
     */
    private PrjQuatPrpsVO prjQuatPrpsCalculateForZGJXFL(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO =PrjQuatPrpsVOTransform.toVO(this.insQuatPrpsAndPrdSchMApiService.prjQuatPrpsCalculateForZG(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
        return prpsVO;
    }
    /**
     * 华润金租报价测算
     */
    private PrjQuatPrpsVO prjQuatPrpsCalculateForZGHRBANK(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO =PrjQuatPrpsVOTransform.toVO(this.insQuatPrpsAndPrdSchMApiService.prjQuatPrpsCalculateForZG(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
        return prpsVO;
    }

	/**
	 * 三湘银行报价测算
	 */
	private PrjQuatPrpsVO prjQuatPrpsCalculateForZGSXBANK(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO = PrjQuatPrpsVOTransform.toVO(this.prjQuatPrpsApiService.prjQuatPrpsCalculateForZGSXBANK(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
		return prpsVO;
	}

	/**
	 * 新邮储银行报价测算
	 */
	private PrjQuatPrpsVO prjQuatPrpsCalculateForZGXYCBANK(PrjQuatPrpsVO prjQuatPrps) {
		PrjQuatPrpsVO prpsVO = PrjQuatPrpsVOTransform.toVO(this.prjQuatPrpsApiService.prjQuatPrpsCalculateForZGXYCBANK(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
		return prpsVO;
	}

    @Override
    public DataResultVO modifyDealZYHistoryData() throws BaseException {
        DataResultVO dataResultVO  = new DataResultVO();
        DataResultDTO resultDTO = prjQuatPrpsZGApiService.modifyDealZYHistoryData();
        dataResultVO.setData(resultDTO.getData());
        dataResultVO.setSuccess(resultDTO.getSuccess());
        return  dataResultVO;
    }

    @Override
    public PrjQuatPrpsVO prjQuatPrpsCalculateForMfr(PrjQuatPrpsVO prjQuatPrps) throws BaseException {
        PrjQuatPrpsVO prpsVO =PrjQuatPrpsVOTransform.toVO(this.prjQuatPrpsApiService.prjQuatPrpsCalculateForMfr(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
        prpsVO = getTotalValue(prpsVO);
        sortPrjPayList(prpsVO.getPrjQuatPrpsPaySchList());
        return prpsVO;
    }


    @Override
    public void checkCCFYPrjQuatPrps(PrjQuatPrpsVO prjQuatPrps) throws BaseException {
       this.prjQuatPrpsApiService.checkCCFYPrjQuatPrps(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps));
    }
    @Override
    public PrjQuatPrpsVO checkZGXBFLPrjQuatPrps(PrjQuatPrpsVO prjQuatPrps) throws BaseException {
       return PrjQuatPrpsVOTransform.toVO(this.prjQuatPrpsApiService.checkZGXBFLPrjQuatPrps(PrjQuatPrpsVOTransform.toDTO(prjQuatPrps)));
    }

    @Override
    public void removePrjQuatByPrjId(Long prjId, Long currentUserId) throws BaseException {
        this.projectModifyApiService.removePrjQuatByPrjId(prjId,currentUserId);
    }

	@Override
	public void removePrjQuatPrpsInfo(Long id) {
		this.prjQuatPrpsApiService.removePrjQuatPrpsInfo(id);
	}
}
